diff --git a/.gitignore b/.gitignore index 69a0106..f3bceeb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,14 @@ job* *.out __pycache__/ -data/ +*/__pycache__/ +# data/ +*/tmp* +generated_schemas +*/job.json +*/workplace +*whl +*/*cif +*/*zip +*egg-info +*/*egg-info diff --git a/README.md b/README.md index 0a4ad75..489e533 100644 --- a/README.md +++ b/README.md @@ -8,26 +8,16 @@ _CrystalFormer_ is a transformer-based autoregressive model specifically designed for space group-controlled generation of crystalline materials. The space group symmetry significantly simplifies the crystal space, which is crucial for data and compute efficient generative modeling of crystalline materials. -
- -

Generating Cs2ZnFe(CN)6 Crystal (mp-570545)

-
-## Contents - -- [Contents](#contents) -- [Model card](#model-card) -- [Get Started](#get-started) -- [Installation](#installation) - - [CPU installation](#cpu-installation) - - [CUDA (GPU) installation](#cuda-gpu-installation) - - [install required packages](#install-required-packages) -- [Available Weights](#available-weights) -- [How to run](#how-to-run) - - [train](#train) - - [sample](#sample) - - [evaluate](#evaluate) -- [How to cite](#how-to-cite) +## Installation + + +```bash + pip install . +``` + +Then command `crystalgpu-app` will create a gradio link. + ## Model card @@ -44,125 +34,7 @@ The model is an autoregressive transformer for the space group conditioned cryst We only consider symmetry inequivalent atoms. The remaining atoms are restored based on the space group and Wyckoff letter information. Note that there is a natural alphabetical ordering for the Wyckoff letters, starting with 'a' for a position with the site-symmetry group of maximal order and ending with the highest letter for the general position. The sampling procedure starts from higher symmetry sites (with smaller multiplicities) and then goes on to lower symmetry ones (with larger multiplicities). Only for the cases where discrete Wyckoff letters can not fully determine the structure, one needs to further consider factional coordinates in the loss or sampling. -## Get Started - -**Notebooks**: The quickest way to get started with _CrystalFormer_ is our notebooks in the Google Colab and Bohrium (Chinese version) platforms: - -- CrystalFormer Quickstart [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1IMQV6OQgIGORE8FmSTmZuC5KgQwGCnDx?usp=sharing) [![Open In Bohrium](https://cdn.dp.tech/bohrium/web/static/images/open-in-bohrium.svg)](https://nb.bohrium.dp.tech/detail/68177247598): GUI notebook demonstrating the conditional generation of crystalline materials with _CrystalFormer_; -- CrystalFormer Application [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1QdkELaQXAHR1zEu2fcdfgabuoP61_wbU?usp=sharing): Generating stable crystals with a given structure prototype. This workflow can be applied to tasks that are dominated by element substitution. - -## Installation - -Create a new environment and install the required packages, we recommend using python `3.10.*` and conda to create the environment: - -```bash - conda create -n crystalgpt python=3.10 - conda activate crystalgpt -``` - -Before installing the required packages, you need to install `jax` and `jaxlib` first. - -### CPU installation - -```bash -pip install -U "jax[cpu]" -``` - -### CUDA (GPU) installation - -If you intend to use CUDA (GPU) to speed up the training, it is important to install the appropriate version of `jax` and `jaxlib`. It is recommended to check the [jax docs](https://github.com/google/jax?tab=readme-ov-file#installation) for the installation guide. The basic installation command is given below: - -```bash -pip install --upgrade pip - -# CUDA 12 installation -# Note: wheels only available on linux. -pip install --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html - -# CUDA 11 installation -# Note: wheels only available on linux. -pip install --upgrade "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html -``` - -### install required packages - -```bash -pip install -r requirements.txt -``` - -## Available Weights - -We release the weights of the model trained on the MP-20 dataset. More details can be seen in the [model](./model/README.md) folder. - -## How to run - -### train - -```bash -python ./src/main.py --folder ./data/ --train_path YOUR_PATH/mp_20/train.csv --valid_path YOUR_PATH/mp_20/val.csv -``` - -- `folder`: the folder to save the model and logs -- `train_path`: the path to the training dataset -- `valid_path`: the path to the validation dataset -- `test_path`: the path to the test dataset - -### sample - -```bash -python ./src/main.py --optimizer none --test_path YOUR_PATH/mp_20/test.csv --restore_path YOUR_MODEL_PATH --spacegroup 160 --num_samples 1000 --batchsize 1000 --temperature 1.0 --use_foriloop -``` - -- `optimizer`: the optimizer to use, `none` means no training, only sampling -- `restore_path`: the path to the model weights -- `spacegroup`: the space group number to sample -- `num_samples`: the number of samples to generate -- `batchsize`: the batch size for sampling -- `temperature`: the temperature for sampling -- `use_foriloop`: use `lax.fori_loop` to speed up the sampling - -You can also use the `element` to sample the specific element. For example, `--element La Ni O` will sample the structure with La, Ni, and O atoms. The sampling results will be saved in the `output_LABEL.csv` file, where the `LABEL` is the space group number `g` specified in the command `--spacegroup`. - -### evaluate - -Before evaluating the generated structures, you need to transform the generated `g, W, A, X, L` to the `cif` format. You can use the following command to transform the generated structures to the `cif` format and save as the `csv` file: - -```bash -python ./scripts/awl2struct.py --output_path YOUR_PATH --label SPACE_GROUP --num_io_process 40 -``` - -- `output_path`: the path to read the generated `L, W, A, X` and save the `cif` files -- `label`: the label to save the `cif` files, which is the space group number `g` -- `num_io_process`: the number of processes - -Calculate the structure and composition validity of the generated structures: - -```bash -python ./scripts/compute_metrics.py --root_path YOUR_PATH --filename YOUR_FILE --num_io_process 40 -``` - -- `root_path`: the path to the dataset -- `filename`: the filename of the generated structures -- `num_io_process`: the number of processes - -Calculate the novelty and uniqueness of the generated structures: - -```bash -python ./scripts/compute_metrics_matbench.py --train_path TRAIN_PATH --test_path TEST_PATH --gen_path GEN_PATH --output_path OUTPUT_PATH --label SPACE_GROUP --num_io_process 40 -``` - -- `train_path`: the path to the training dataset -- `test_path`: the path to the test dataset -- `gen_path`: the path to the generated dataset -- `output_path`: the path to save the metrics results -- `label`: the label to save the metrics results, which is the space group number `g` -- `num_io_process`: the number of processes - -Note that the training, test, and generated datasets should contain the structures within the **same** space group `g` which is specified in the command `--label`. - -More details about the post-processing can be seen in the [scripts](./scripts/README.md) folder. -## How to cite ```bibtex @misc{cao2024space, @@ -175,4 +47,3 @@ More details about the post-processing can be seen in the [scripts](./scripts/RE } ``` -**Note**: This project is unrelated to https://github.com/omron-sinicx/crystalformer with the same name. diff --git a/build/lib/crystalformerapp/__init__.py b/build/lib/crystalformerapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/build/lib/crystalformerapp/data/__init__.py b/build/lib/crystalformerapp/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/data/mini.csv b/build/lib/crystalformerapp/data/mini.csv similarity index 100% rename from data/mini.csv rename to build/lib/crystalformerapp/data/mini.csv diff --git a/data/wyckoff_list.csv b/build/lib/crystalformerapp/data/wyckoff_list.csv similarity index 100% rename from data/wyckoff_list.csv rename to build/lib/crystalformerapp/data/wyckoff_list.csv diff --git a/data/wyckoff_symbols.csv b/build/lib/crystalformerapp/data/wyckoff_symbols.csv similarity index 100% rename from data/wyckoff_symbols.csv rename to build/lib/crystalformerapp/data/wyckoff_symbols.csv diff --git a/build/lib/crystalformerapp/gr_frontend.py b/build/lib/crystalformerapp/gr_frontend.py new file mode 100644 index 0000000..fa997f7 --- /dev/null +++ b/build/lib/crystalformerapp/gr_frontend.py @@ -0,0 +1,137 @@ +import gradio as gr +from gradio_materialviewer import MaterialViewer +import tempfile +import os +import sys +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from simple_op import run_crystalformer +from op import run_op, run_op_gpu + +def main(): + with tempfile.TemporaryDirectory(dir=".") as tempdir: + with gr.Blocks() as app: + with gr.Tab(label="Quick Start Mode"): + with gr.Row(): + with gr.Column(): + spacegroup = gr.Slider(label="Spacegroup", minimum=1, maximum=230, value=225, step=1) + elements = gr.Textbox(label="Elements", value="C") + with gr.Column(): + temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=2.0, value=1.0, step=0.1) + seed = gr.Number(label="Seed", value=42) + + with gr.Row(): + generate_btn = gr.Button("Generate Structure") + clear_btn = gr.Button("Clear Inputs") + + output_file = gr.File(label="CIF File") + material_viewer = MaterialViewer(height=480, materialFile="", format='cif') + + def generate_and_display_structure(sp, el, temp, sd): + cif_file_path = run_crystalformer(sp, el, temp, sd, tempdir) + with open(cif_file_path, 'r') as ff: + cif_content = "".join(ff.readlines()) + return cif_file_path, MaterialViewer(materialFile=cif_content, format='cif', height=480) + + generate_btn.click( + fn=generate_and_display_structure, + inputs=[spacegroup, elements, temperature, seed], + outputs=[output_file, material_viewer] + ) + + clear_btn.click( + fn=lambda: (225, "C", 1.0, 42), + inputs=None, + outputs=[spacegroup, elements, temperature, seed] + ) + + gr.Markdown(""" + # Quick Start Mode + + Generate crystal structures with Quick Start Mode. + + ## Instructions: + 1. Enter the spacegroup number + 2. Specify the elements (comma-separated) + 3. Adjust the temperature + 4. Set a random seed (optional) + 5. Click 'Generate Structure' to create the CIF file + """) + + with gr.Tab(label="Research Mode"): + with gr.Row(): + with gr.Column(): + spacegroup = gr.Slider(label="Spacegroup", minimum=1, maximum=230, value=225, step=1) + elements = gr.Textbox(label="Elements", value="C") + wyckoff = gr.Textbox(label="Wyckoff", value="a") + with gr.Column(): + seed = gr.Number(label="Seed", value=42) + temperature = gr.Slider(label="Temperature", minimum=0.5, maximum=1.5, value=1.0, step=0.1) + T1 = gr.Slider(label="T1", minimum=100, maximum=100000000, value=100, step=100) + nsweeps = gr.Slider(label="nsweeps", minimum=0, maximum=20, value=10, step=1) + with gr.Row(): + access_key = gr.Textbox(label="Access Key") + project_id = gr.Textbox(label="Project ID") + machine_type = gr.Dropdown(label="Machine Type", choices=[ + "1 * NVIDIA T4_16g", + "1 * NVIDIA V100_32g", + "c12_m64_1 * NVIDIA L4", + ]) + + with gr.Row(): + generateWeb_btn = gr.Button("Generate Structure") + generateGPU_btn = gr.Button("Generate Structure on GPU machines") + clear_btn = gr.Button("Clear Inputs") + + output_file = gr.File(label="CIF File") + material_viewer = MaterialViewer(height=480, materialFile="", format='cif') + + def generate_and_display_structure_web(sp, el, wy, temp, sd, T1, ns): + cif_file_path = run_op(sp, el, wy, temp, sd, T1, ns, tempdir) + with open(cif_file_path, 'r') as ff: + cif_content = "".join(ff.readlines()) + return cif_file_path, MaterialViewer(materialFile=cif_content, format='cif', height=480) + + generateWeb_btn.click( + fn=generate_and_display_structure_web, + inputs=[spacegroup, elements, wyckoff, temperature, seed, T1, nsweeps], + outputs=[output_file, material_viewer] + ) + + def generate_and_display_structure_gpu(sp, el, wy, temp, sd, T1, ns, ak, pid, mt): + cif_file_path = run_op_gpu(sp, el, wy, temp, sd, T1, ns, ak, pid, mt, tempdir) + with open(cif_file_path, 'r') as ff: + cif_content = "".join(ff.readlines()) + return cif_file_path, MaterialViewer(materialFile=cif_content, format='cif', height=480) + + generateGPU_btn.click( + fn=generate_and_display_structure_gpu, + inputs=[spacegroup, elements, wyckoff, temperature, seed, T1, nsweeps, access_key, project_id, machine_type], + outputs=[output_file, material_viewer] + ) + + clear_btn.click( + fn=lambda: (225, "C", 1.0, 42), + inputs=None, + outputs=[spacegroup, elements, temperature, seed] + ) + + gr.Markdown(""" + # Research Mode + + Generate crystal structures with Research Mode. + + ## Instructions: + - **seed**: random seed to sample the crystal structure + - **spacegroup**: control the space group of generated crystals + - **temperature**: modifies the probability distribution + - **T1**: the temperature of sampling the first atom type + - **elements**: control the elements in the generating process. Note that you need to enter the elements separated by spaces, i.e., Ba Ti O, if the elements string is none, the model will not limit the elements + - **wyckoff**: control the Wyckoff letters in the generation. Note that you need to enter the Wyckoff letters separated by spaces, i.e., a c, if the Wyckoff is none, the model will not limit the wyckoff letter. + - **nsweeps**: control the steps of mcmc to refine the generated structures + """) + + app.launch(share=True) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/build/lib/crystalformerapp/launching.py b/build/lib/crystalformerapp/launching.py new file mode 100644 index 0000000..59bf376 --- /dev/null +++ b/build/lib/crystalformerapp/launching.py @@ -0,0 +1,48 @@ +import json +import shutil +from pathlib import Path +import os +import dp.launching.typing.addon.ui as ui +import traceback +from pprint import pprint + +from dp.launching.cli import (SubParser, default_exception_handler, + run_sp_and_exit, to_runner) +from dp.launching.report import (AutoReportElement, MetricsChartReportElement, + Report, ReportSection) +from dp.launching.typing import (BaseModel, BohriumProjectId, + BohriumUsername, Boolean, Enum, Field, Float, + InputFilePath, Int, List, Literal, + Optional, OutputDirectory, String, DataSet, Union) +from dp.launching.typing.addon.sysmbol import Equal + + +class CrystalformerOptions(BaseModel): + spacegroup: Int = Field(ge=1, le=230, description="Space group number") + elements: String = Field(description="Elements to include, separated by spaces") + temperature: Float = Field(ge=0.5, le=1.5, default=1.0, description="Temperature for generation") + seed: Int = Field(default=42, description="Random seed") + + +def crystalformer_runner(opts: CrystalformerOptions) -> int: + try: + run_crystalformer( + spacegroup=opts.spacegroup, + elements=opts.elements, + temperature=opts.temperature, + seed=opts.seed + ) + return 0 + except Exception as exc: + print(str(exc)) + traceback.print_exc() + return 1 + +def to_parser(): + return { + "1": SubParser(CrystalformerOptions, crystalformer_runner, "Run Crystalformer") + } + + +if __name__ == '__main__': + run_sp_and_exit(to_parser(), description="Crystal Former", version="0.1.0", exception_handler=default_exception_handler) \ No newline at end of file diff --git a/model/README.md b/build/lib/crystalformerapp/model/README.md similarity index 100% rename from model/README.md rename to build/lib/crystalformerapp/model/README.md diff --git a/model/config.yaml b/build/lib/crystalformerapp/model/config.yaml similarity index 100% rename from model/config.yaml rename to build/lib/crystalformerapp/model/config.yaml diff --git a/build/lib/crystalformerapp/model/epoch_009800.pkl b/build/lib/crystalformerapp/model/epoch_009800.pkl new file mode 100644 index 0000000..9a05612 Binary files /dev/null and b/build/lib/crystalformerapp/model/epoch_009800.pkl differ diff --git a/build/lib/crystalformerapp/op.py b/build/lib/crystalformerapp/op.py new file mode 100644 index 0000000..deffaf0 --- /dev/null +++ b/build/lib/crystalformerapp/op.py @@ -0,0 +1,216 @@ +import gdown +import sys +import yaml +import os +import datetime +import jax +import jax.numpy as jnp +from jax.flatten_util import ravel_pytree + +from jax.lib import xla_bridge +# Check if GPU is available +try: + if xla_bridge.get_backend().platform == 'gpu': + print("GPU is available. Using GPU.") + else: + raise RuntimeError("No GPU available, switching to CPU.") +except RuntimeError as e: + print(e) + os.environ["JAX_PLATFORMS"] = "cpu" + jax.config.update("jax_platform_name", "cpu") + print("Changed platform to CPU.") + +# from hydra import initialize, compose +import numpy as np +import ipywidgets as widgets +from pymatgen.core import Structure, Lattice +from weas_widget import WeasWidget + +import os +import sys +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from crystalformerapp import src +from src.sample import sample_crystal, make_update_lattice +from src.elements import element_dict, element_list +from scripts.awl2struct import get_struct_from_lawx +from src.utils import letter_to_number +from src.mcmc import make_mcmc_step +from src.loss import make_loss_fn + +from src.checkpoint import find_ckpt_filename +from src.transformer import make_transformer + +output = "epoch_009800.pkl" + + +current_dir = os.path.dirname(__file__) +file_path = os.path.join(current_dir, "model", "config.yaml") + +with open(file_path) as stream: + args = yaml.safe_load(stream) + + +class MyObject: + def __init__(self, d=None): + for key, value in d.items(): + setattr(self, key, value) + +args = MyObject(args) +key = jax.random.PRNGKey(42) +params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + 4, 8, + 32, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + 0.3) + +print("\n========== Load checkpoint==========") +restore_path = "./" +ckpt_filename, epoch_finished = find_ckpt_filename(restore_path) +if ckpt_filename is not None: + print("Load checkpoint file: %s, epoch finished: %g" %(ckpt_filename, epoch_finished)) + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] +else: + print("No checkpoint file found. Start from scratch.") + +print ("# of transformer params", ravel_pytree(params)[0].size) + +jax.config.update("jax_enable_x64", True) # to get off compilation warning, and to prevent sample nan lattice +loss_fn, logp_fn = make_loss_fn(args.n_max, args.atom_types, args.wyck_types, args.Kx, args.Kl, transformer, args.lamb_a, args.lamb_w, args.lamb_l) + + +def run_op( + spacegroup, elements, wyckoff, + temperature, seed, T1, nsweeps, + tempdir +): + top_p = 1 + mc_width = 0.1 + n_sample = 1 + + elements = elements.split() + if elements is not None: + idx = [element_dict[e] for e in elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + print ('sampling structure formed by these elements:', elements) + print (atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) # we will do nothing to a_logit in sampling + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + + wyckoff = wyckoff.split() + if wyckoff is not None: + idx = [letter_to_number(w) for w in wyckoff] + # padding 0 until the length is args.n_max + w_mask = idx + [0]*(args.n_max -len(idx)) + print(w_mask) + w_mask = jnp.array(w_mask, dtype=int) + print ('sampling structure formed by these Wyckoff positions:', wyckoff) + print (w_mask) + else: + w_mask = None + + temperature = jnp.array(temperature, dtype=float) + constraints = jnp.arange(0, args.n_max, 1) + + mc_steps = nsweeps * args.n_max + print("mc_steps", mc_steps) + mcmc = make_mcmc_step(params, n_max=args.n_max, atom_types=args.atom_types, atom_mask=atom_mask, constraints=constraints) + update_lattice = make_update_lattice(transformer, params, args.atom_types, args.Kl, args.top_p, args.temperature) + + key = jax.random.PRNGKey(seed) + key, subkey = jax.random.split(key) + XYZ, A, W, M, L = sample_crystal(subkey, transformer, params, args.n_max, n_sample, args.atom_types, args.wyck_types, args.Kx, args.Kl, spacegroup, w_mask, atom_mask, top_p, temperature, T1, constraints) + G = jnp.array([spacegroup for i in range(len(L))]) + x = (G, L, XYZ, A, W) + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x, key=subkey, mc_steps=mc_steps, mc_width=mc_width) + print("acc", acc) + + G, L, XYZ, A, W = x + key, subkey = jax.random.split(key) + L = update_lattice(subkey, G, XYZ, A, W) + + + XYZ = np.array(XYZ) + A = np.array(A) + W = np.array(W) + L = np.array(L) + G = np.array(G) + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + + output_file = os.path.join(tempdir, "pred_struct.cif") + structures[0].to(output_file) + + return output_file + + +def run_op_gpu( + spacegroup, elements, wyckoff, + temperature, seed, T1, nsweeps, + access_key, project_id, machine_type, + tempdir +): + from bohrium_open_sdk import OpenSDK + import time + + client = OpenSDK(access_key=access_key) + + if not os.path.exists(tempdir): + os.makedirs(tempdir) + cmd = ( + f"python -c \"" + f"import os; " + f"import crystalformerapp; " + f"from crystalformerapp import op; " + f"op.run_op({spacegroup}, '{elements}', '{wyckoff}', " + f"{temperature}, {seed}, {T1}, {nsweeps}, f'./')" + f"\"" + ) + + # Convert project_id to native Python int + project_id_native = int(np.uint64(project_id)) + + resp = client.job.submit( + project_id=project_id_native, + machine_type=machine_type, + job_name="crystalformer", + cmd=cmd, + image_address="registry.dp.tech/dptech/prod-19853/crystal-former:0.0.2", + out_files=["*cif"], + dataset_path=[], + job_group_id=0, + ) + + print("Job submitted. Waiting for completion...") + + # Loop to check the job status + job_id = resp["data"]['jobId'] + while True: + job_info = client.job.detail(job_id) + job_status = job_info["data"]["status"] + if job_status == 2: + print("Job completed!") + client.job.download(job_id, f'{tempdir}/out.zip') + os.system(f"unzip {tempdir}/out.zip -d {tempdir}") + return os.path.join(tempdir, "pred_struct.cif") + break + + elif job_status == -1: + print("Job failed.") + break + else: + print("Job not done yet. Checking again after 30 seconds...") + time.sleep(30) # Pause for 30 seconds before checking the status again + + diff --git a/build/lib/crystalformerapp/op_gpu.py b/build/lib/crystalformerapp/op_gpu.py new file mode 100644 index 0000000..9458c44 --- /dev/null +++ b/build/lib/crystalformerapp/op_gpu.py @@ -0,0 +1,5 @@ +from op import run_op +from bohrium_open_sdk import OpenSDK + +input_params +run_op() \ No newline at end of file diff --git a/build/lib/crystalformerapp/scripts/__init__.py b/build/lib/crystalformerapp/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/scripts/awl2struct.py b/build/lib/crystalformerapp/scripts/awl2struct.py similarity index 97% rename from scripts/awl2struct.py rename to build/lib/crystalformerapp/scripts/awl2struct.py index ead153a..5d57649 100644 --- a/scripts/awl2struct.py +++ b/build/lib/crystalformerapp/scripts/awl2struct.py @@ -1,5 +1,4 @@ import sys -sys.path.append('./src/') import pandas as pd import numpy as np @@ -8,8 +7,9 @@ import itertools import argparse +from crystalformerapp import src from pymatgen.core import Structure, Lattice -from wyckoff import wmax_table, mult_table, symops +from src.wyckoff import wmax_table, mult_table, symops symops = np.array(symops) mult_table = np.array(mult_table) diff --git a/scripts/compute_metrics.py b/build/lib/crystalformerapp/scripts/compute_metrics.py similarity index 100% rename from scripts/compute_metrics.py rename to build/lib/crystalformerapp/scripts/compute_metrics.py diff --git a/scripts/compute_metrics_matbench.py b/build/lib/crystalformerapp/scripts/compute_metrics_matbench.py similarity index 100% rename from scripts/compute_metrics_matbench.py rename to build/lib/crystalformerapp/scripts/compute_metrics_matbench.py diff --git a/scripts/config.py b/build/lib/crystalformerapp/scripts/config.py similarity index 100% rename from scripts/config.py rename to build/lib/crystalformerapp/scripts/config.py diff --git a/scripts/e_above_hull.py b/build/lib/crystalformerapp/scripts/e_above_hull.py similarity index 100% rename from scripts/e_above_hull.py rename to build/lib/crystalformerapp/scripts/e_above_hull.py diff --git a/scripts/eval_utils.py b/build/lib/crystalformerapp/scripts/eval_utils.py similarity index 100% rename from scripts/eval_utils.py rename to build/lib/crystalformerapp/scripts/eval_utils.py diff --git a/scripts/matgl_relax.py b/build/lib/crystalformerapp/scripts/matgl_relax.py similarity index 100% rename from scripts/matgl_relax.py rename to build/lib/crystalformerapp/scripts/matgl_relax.py diff --git a/scripts/plot_embedding.py b/build/lib/crystalformerapp/scripts/plot_embedding.py similarity index 100% rename from scripts/plot_embedding.py rename to build/lib/crystalformerapp/scripts/plot_embedding.py diff --git a/build/lib/crystalformerapp/simple_op.py b/build/lib/crystalformerapp/simple_op.py new file mode 100644 index 0000000..84c1ad7 --- /dev/null +++ b/build/lib/crystalformerapp/simple_op.py @@ -0,0 +1,116 @@ +import sys +import os +import jax +import jax.numpy as jnp +from hydra import initialize, compose +import numpy as np +from pymatgen.core import Structure +from time import time +from pymatgen.io.ase import AseAtomsAdaptor +from ase.io import write + +from jax.lib import xla_bridge +# Check if GPU is available +try: + if xla_bridge.get_backend().platform == 'gpu': + print("GPU is available. Using GPU.") + else: + raise RuntimeError("No GPU available, switching to CPU.") +except RuntimeError as e: + print(e) + os.environ["JAX_PLATFORMS"] = "cpu" + jax.config.update("jax_platform_name", "cpu") + print("Changed platform to CPU.") + +from crystalformerapp import src, scripts +from src.elements import element_dict +from scripts.awl2struct import get_struct_from_lawx +from src.checkpoint import find_ckpt_filename +from src.transformer import make_transformer +from src.simple_sample import sample_crystal + +import io +import tempfile +import shutil + +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +def configure_jax(): + jax.config.update("jax_enable_x64", True) + +def initialize_parameters(args, seed=42): + key = jax.random.PRNGKey(seed) + params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + 4, 8, + 32, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + 0.3) + return params, transformer + +def load_checkpoint(restore_path): + print("\n========== Load checkpoint==========") + ckpt_filename, epoch_finished = (restore_path) + if ckpt_filename is not None: + print(f"Load checkpoint file: {ckpt_filename}, epoch finished: {epoch_finished}") + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] + else: + print("No checkpoint file found. Start from scratch.") + params = None + return params + +def generate_crystal(spacegroup, elements, temperature, seed, params, transformer, args): + print(f"Generating with spacegroup={spacegroup}, elements={elements}, temperature={temperature}") + top_p = 1 + n_sample = 1 + elements = elements.split() + if elements: + idx = [element_dict[e] for e in elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) + + key = jax.random.PRNGKey(seed) + key, subkey = jax.random.split(key) + start_time = time() + XYZ, A, W, M, L = sample_crystal( + subkey, + transformer, + params, + args.n_max, + n_sample, + args.atom_types, + args.wyck_types, + args.Kx, args.Kl, + spacegroup, None, + atom_mask, top_p, + temperature, + temperature, + args.use_foriloop) + + end_time = time() + print(f"Execution time: {end_time - start_time}") + + XYZ, A, W, L = map(np.array, (XYZ, A, W, L)) + G = np.array([spacegroup for _ in range(len(L))]) + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + atoms_list = [AseAtomsAdaptor().get_atoms(struct) for struct in structures] + + return atoms_list + +def run_crystalformer(spacegroup, elements, temperature, seed, tempdir): + configure_jax() + with initialize(version_base=None, config_path="./model"): + args = compose(config_name="config") + params, transformer = initialize_parameters(args) + restore_path = "/share/" + + params = load_checkpoint(restore_path) if params is None else params + atoms_list = generate_crystal(spacegroup, elements, temperature, seed, params, transformer, args) + outputPath = os.path.join(tempdir, "pred_struct.cif") + write(outputPath, atoms_list[-1], format="cif") + + return outputPath \ No newline at end of file diff --git a/build/lib/crystalformerapp/src/__init__.py b/build/lib/crystalformerapp/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/attention.py b/build/lib/crystalformerapp/src/attention.py similarity index 100% rename from src/attention.py rename to build/lib/crystalformerapp/src/attention.py diff --git a/src/checkpoint.py b/build/lib/crystalformerapp/src/checkpoint.py similarity index 100% rename from src/checkpoint.py rename to build/lib/crystalformerapp/src/checkpoint.py diff --git a/src/elements.py b/build/lib/crystalformerapp/src/elements.py similarity index 100% rename from src/elements.py rename to build/lib/crystalformerapp/src/elements.py diff --git a/src/lattice.py b/build/lib/crystalformerapp/src/lattice.py similarity index 100% rename from src/lattice.py rename to build/lib/crystalformerapp/src/lattice.py diff --git a/src/loss.py b/build/lib/crystalformerapp/src/loss.py similarity index 97% rename from src/loss.py rename to build/lib/crystalformerapp/src/loss.py index 4ff0423..a59c448 100644 --- a/src/loss.py +++ b/build/lib/crystalformerapp/src/loss.py @@ -3,9 +3,9 @@ import jax.numpy as jnp from functools import partial -from von_mises import von_mises_logpdf -from lattice import make_lattice_mask -from wyckoff import mult_table, fc_mask_table +from .von_mises import von_mises_logpdf +from .lattice import make_lattice_mask +from .wyckoff import mult_table, fc_mask_table def make_loss_fn(n_max, atom_types, wyck_types, Kx, Kl, transformer, lamb_a=1.0, lamb_w=1.0, lamb_l=1.0): diff --git a/src/main.py b/build/lib/crystalformerapp/src/main.py similarity index 78% rename from src/main.py rename to build/lib/crystalformerapp/src/main.py index a000c1a..f7ec2e9 100644 --- a/src/main.py +++ b/build/lib/crystalformerapp/src/main.py @@ -7,14 +7,15 @@ import multiprocessing import math -from utils import GLXYZAW_from_file, GLXA_to_csv, letter_to_number -from elements import element_dict, element_list -from transformer import make_transformer -from train import train -from sample import sample_crystal -from loss import make_loss_fn -import checkpoint -from wyckoff import mult_table +from .utils import GLXYZAW_from_file, GLXA_to_csv, letter_to_number +from .elements import element_dict, element_list +from .transformer import make_transformer +from .train import train +from .sample import sample_crystal, make_update_lattice +from .loss import make_loss_fn +from .checkpoint import find_ckpt_filename +from .wyckoff import mult_table +from .mcmc import make_mcmc_step import argparse parser = argparse.ArgumentParser(description='') @@ -69,9 +70,13 @@ group.add_argument('--T1', type=float, default=None, help='temperature used for sampling the first atom type') group.add_argument('--num_io_process', type=int, default=40, help='number of process used in multiprocessing io') group.add_argument('--num_samples', type=int, default=1000, help='number of test samples') -group.add_argument('--use_foriloop', action='store_true', help='use lax.fori_loop in sampling') group.add_argument('--output_filename', type=str, default='output.csv', help='outfile to save sampled structures') +group = parser.add_argument_group('MCMC parameters') +group.add_argument('--mcmc', action='store_true', help='use MCMC to sample') +group.add_argument('--nsweeps', type=int, default=10, help='number of sweeps') +group.add_argument('--mc_width', type=float, default=0.1, help='width of MCMC step') + args = parser.parse_args() key = jax.random.PRNGKey(42) @@ -91,24 +96,59 @@ assert (args.spacegroup is not None) # for inference we need to specify space group test_data = GLXYZAW_from_file(args.test_path, args.atom_types, args.wyck_types, args.n_max, args.num_io_process) + # jnp.set_printoptions(threshold=jnp.inf) # print full array + constraints = jnp.arange(0, args.n_max, 1) + if args.elements is not None: - idx = [element_dict[e] for e in args.elements] - atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] - atom_mask = jnp.array(atom_mask) - print ('sampling structure formed by these elements:', args.elements) - print (atom_mask) + # judge that if the input elements is a json file + if args.elements[0].endswith('.json'): + import json + with open(args.elements[0], 'r') as f: + _data = json.load(f) + atoms_list = _data["atom_mask"] + _constraints = _data["constraints"] + print(_constraints) + + for old_val, new_val in _constraints: + constraints = jnp.where(constraints == new_val, constraints[old_val], constraints) # update constraints + print("constraints", constraints) + + assert len(atoms_list) == len(args.wyckoff) + print ('sampling structure formed by these elements:', atoms_list) + atom_mask = [] + for elements in atoms_list: + idx = [element_dict[e] for e in elements] + atom_mask_ = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask.append(atom_mask_) + + # padding 0 until the atom_mask shape is (args.n_max, args.atom_types) + atom_mask = jnp.array(atom_mask) + atom_mask = jnp.pad(atom_mask, ((0, args.n_max-atom_mask.shape[0]), (0, 0)), mode='constant') + print(atom_mask) + else: + idx = [element_dict[e] for e in args.elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + print ('sampling structure formed by these elements:', args.elements) + print (atom_mask) + else: if args.remove_radioactive: from elements import radioactive_elements_dict, noble_gas_dict # remove radioactive elements and noble gas atom_mask = [1] + [1 if i not in radioactive_elements_dict.values() and i not in noble_gas_dict.values() else 0 for i in range(1, args.atom_types)] atom_mask = jnp.array(atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) print('sampling structure formed by non-radioactive elements and non-noble gas') print(atom_mask) else: atom_mask = jnp.zeros((args.atom_types), dtype=int) # we will do nothing to a_logit in sampling - print(f'there is total {jnp.sum(atom_mask)-1} elements') + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + print(atom_mask) + # print(f'there is total {jnp.sum(atom_mask)-1} elements') + print(atom_mask.shape) if args.wyckoff is not None: idx = [letter_to_number(w) for w in args.wyckoff] @@ -152,7 +192,7 @@ print("\n========== Load checkpoint==========") -ckpt_filename, epoch_finished = checkpoint.find_ckpt_filename(args.restore_path or output_path) +ckpt_filename, epoch_finished = find_ckpt_filename(args.restore_path or output_path) if ckpt_filename is not None: print("Load checkpoint file: %s, epoch finished: %g" %(ckpt_filename, epoch_finished)) ckpt = checkpoint.load_data(ckpt_filename) @@ -221,6 +261,11 @@ else: T1 = args.temperature + mc_steps = args.nsweeps * args.n_max + print("mc_steps", mc_steps) + mcmc = make_mcmc_step(params, n_max=args.n_max, atom_types=args.atom_types, atom_mask=atom_mask, constraints=constraints) + update_lattice = make_update_lattice(transformer, params, args.atom_types, args.Kl, args.top_p, args.temperature) + num_batches = math.ceil(args.num_samples / args.batchsize) name, extension = args.output_filename.rsplit('.', 1) filename = os.path.join(output_path, @@ -230,7 +275,19 @@ end_idx = min(start_idx + args.batchsize, args.num_samples) n_sample = end_idx - start_idx key, subkey = jax.random.split(key) - XYZ, A, W, M, L = sample_crystal(subkey, transformer, params, args.n_max, n_sample, args.atom_types, args.wyck_types, args.Kx, args.Kl, args.spacegroup, w_mask, atom_mask, args.top_p, args.temperature, T1, args.use_foriloop) + XYZ, A, W, M, L = sample_crystal(subkey, transformer, params, args.n_max, n_sample, args.atom_types, args.wyck_types, args.Kx, args.Kl, args.spacegroup, w_mask, atom_mask, args.top_p, args.temperature, T1, constraints) + + G = args.spacegroup * jnp.ones((n_sample), dtype=int) + if args.mcmc: + x = (G, L, XYZ, A, W) + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x, key=subkey, mc_steps=mc_steps, mc_width=args.mc_width) + print("acc", acc) + + G, L, XYZ, A, W = x + key, subkey = jax.random.split(key) + L = update_lattice(subkey, G, XYZ, A, W) + print ("XYZ:\n", XYZ) # fractional coordinate print ("A:\n", A) # element type print ("W:\n", W) # Wyckoff positions @@ -256,7 +313,7 @@ angle = angle * (jnp.pi / 180) # to rad L = jnp.concatenate([length, angle], axis=-1) - G = args.spacegroup * jnp.ones((n_sample), dtype=int) + # G = args.spacegroup * jnp.ones((n_sample), dtype=int) logp_w, logp_xyz, logp_a, logp_l = jax.jit(logp_fn, static_argnums=7)(params, key, G, L, XYZ, A, W, False) data['logp_w'] = np.array(logp_w).tolist() @@ -270,4 +327,4 @@ data.to_csv(filename, mode='a', index=False, header=header) # GLXA_to_csv(args.spacegroup, L, XYZ, A, num_worker=args.num_io_process, filename=filename) - print ("Wrote samples to %s"%filename) + print ("Wrote samples to %s"%filename) \ No newline at end of file diff --git a/build/lib/crystalformerapp/src/mcmc.py b/build/lib/crystalformerapp/src/mcmc.py new file mode 100644 index 0000000..7b97416 --- /dev/null +++ b/build/lib/crystalformerapp/src/mcmc.py @@ -0,0 +1,148 @@ +import jax +import jax.numpy as jnp +from functools import partial + +from .wyckoff import fc_mask_table +from .von_mises import sample_von_mises + + +get_fc_mask = lambda g, w: jnp.logical_and((w>0)[:, None], fc_mask_table[g-1, w]) + +def make_mcmc_step(params, n_max, atom_types, atom_mask=None, constraints=None): + + if atom_mask is None or jnp.all(atom_mask == 0): + atom_mask = jnp.ones((n_max, atom_types)) + + if constraints is None: + constraints = jnp.arange(0, n_max, 1) + + def update_A(i, A, a, constraints): + def body_fn(j, A): + A = jax.lax.cond(constraints[j] == constraints[i], + lambda _: A.at[:, j].set(a), + lambda _: A, + None) + return A + + A = jax.lax.fori_loop(0, A.shape[1], body_fn, A) + return A + + @partial(jax.jit, static_argnums=0) + def mcmc(logp_fn, x_init, key, mc_steps, mc_width): + """ + Markov Chain Monte Carlo sampling algorithm. + + INPUT: + logp_fn: callable that evaluate log-probability of a batch of configuration x. + The signature is logp_fn(x), where x has shape (batch, n, dim). + x_init: initial value of x, with shape (batch, n, dim). + key: initial PRNG key. + mc_steps: total number of Monte Carlo steps. + mc_width: size of the Monte Carlo proposal. + + OUTPUT: + x: resulting batch samples, with the same shape as `x_init`. + """ + def step(i, state): + + def true_func(i, state): + x, logp, key, num_accepts = state + G, L, XYZ, A, W = x + key, key_proposal_A, key_proposal_XYZ, key_accept, key_logp = jax.random.split(key, 5) + + p_normalized = atom_mask[i%n_max] / jnp.sum(atom_mask[i%n_max]) # only propose atom types that are allowed + _a = jax.random.choice(key_proposal_A, a=atom_types, p=p_normalized, shape=(A.shape[0], )) + # _A = A.at[:, i%n_max].set(_a) + _A = update_A(i%n_max, A, _a, constraints) + A_proposal = jnp.where(A == 0, A, _A) + + fc_mask = jax.vmap(get_fc_mask, in_axes=(0, 0))(G, W) + _xyz = XYZ[:, i%n_max] + sample_von_mises(key_proposal_XYZ, 0, 1/mc_width**2, XYZ[:, i%n_max].shape) + _XYZ = XYZ.at[:, i%n_max].set(_xyz) + _XYZ -= jnp.floor(_XYZ) # wrap to [0, 1) + XYZ_proposal = jnp.where(fc_mask, _XYZ, XYZ) + x_proposal = (G, L, XYZ_proposal, A_proposal, W) + + logp_w, logp_xyz, logp_a, _ = logp_fn(params, key_logp, *x_proposal, False) + logp_proposal = logp_w + logp_xyz + logp_a + + ratio = jnp.exp((logp_proposal - logp)) + accept = jax.random.uniform(key_accept, ratio.shape) < ratio + + A_new = jnp.where(accept[:, None], A_proposal, A) # update atom types + XYZ_new = jnp.where(accept[:, None, None], XYZ_proposal, XYZ) # update atom positions + x_new = (G, L, XYZ_new, A_new, W) + logp_new = jnp.where(accept, logp_proposal, logp) + num_accepts += jnp.sum(accept*jnp.where(A[:, i%n_max]==0, 0, 1)) + return x_new, logp_new, key, num_accepts + + def false_func(i, state): + x, logp, key, num_accepts = state + return x, logp, key, num_accepts + + x, logp, key, num_accepts = state + A = x[3] + x, logp, key, num_accepts = jax.lax.cond(A[:, i%n_max].sum() != 0, + lambda _: true_func(i, state), + lambda _: false_func(i, state), + None) + return x, logp, key, num_accepts + + key, subkey = jax.random.split(key) + logp_w, logp_xyz, logp_a, _ = logp_fn(params, subkey, *x_init, False) + logp_init = logp_w + logp_xyz + logp_a + # print("logp_init", logp_init) + + x, logp, key, num_accepts = jax.lax.fori_loop(0, mc_steps, step, (x_init, logp_init, key, 0.)) + # print("logp", logp) + A = x[3] + scale = jnp.sum(A != 0)/(A.shape[0]*n_max) + accept_rate = num_accepts / (scale * mc_steps * x[0].shape[0]) + return x, accept_rate + + return mcmc + + +if __name__ == "__main__": + from utils import GLXYZAW_from_file + from loss import make_loss_fn + from transformer import make_transformer + atom_types = 119 + n_max = 21 + wyck_types = 28 + Nf = 5 + Kx = 16 + Kl = 4 + dropout_rate = 0.3 + + csv_file = '../data/mini.csv' + G, L, XYZ, A, W = GLXYZAW_from_file(csv_file, atom_types, wyck_types, n_max) + + key = jax.random.PRNGKey(42) + + params, transformer = make_transformer(key, Nf, Kx, Kl, n_max, 128, 4, 4, 8, 16, 16, atom_types, wyck_types, dropout_rate) + + loss_fn, logp_fn = make_loss_fn(n_max, atom_types, wyck_types, Kx, Kl, transformer) + + # MCMC sampling test + mc_steps = 21 + mc_width = 0.1 + x_init = (G[:5], L[:5], XYZ[:5], A[:5], W[:5]) + + value = jax.jit(logp_fn, static_argnums=7)(params, key, *x_init, False) + + jnp.set_printoptions(threshold=jnp.inf) + mcmc = make_mcmc_step(params, n_max=n_max, atom_types=atom_types) + + for i in range(5): + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x_init, key=subkey, mc_steps=mc_steps, mc_width=mc_width) + print(i, acc) + + print("check if the atom type is changed") + print(x_init[3]) + print(x[3]) + + print("check if the atom position is changed") + print(x_init[2]) + print(x[2]) \ No newline at end of file diff --git a/build/lib/crystalformerapp/src/sample.py b/build/lib/crystalformerapp/src/sample.py new file mode 100644 index 0000000..23bdd8a --- /dev/null +++ b/build/lib/crystalformerapp/src/sample.py @@ -0,0 +1,221 @@ +import jax +import jax.numpy as jnp +from functools import partial + +from .von_mises import sample_von_mises +from .lattice import symmetrize_lattice +from .wyckoff import mult_table, symops + +def project_xyz(g, w, x, idx): + ''' + apply the randomly sampled Wyckoff symmetry op to sampled fc, which + should be (or close to) the first WP + ''' + op = symops[g-1, w, idx].reshape(3, 4) + affine_point = jnp.array([*x, 1]) # (4, ) + x = jnp.dot(op, affine_point) # (3, ) + x -= jnp.floor(x) + return x + +@partial(jax.vmap, in_axes=(None, None, None, 0, 0, 0, 0, 0), out_axes=0) # batch +def inference(model, params, g, W, A, X, Y, Z): + XYZ = jnp.concatenate([X[:, None], + Y[:, None], + Z[:, None] + ], + axis=-1) + M = mult_table[g-1, W] + return model(params, None, g, XYZ, A, W, M, False) + +def sample_top_p(key, logits, p, temperature): + ''' + drop remaining logits once the cumulative_probs is larger than p + for very small p, we may drop everything excet the leading logit + for very large p, we will keep everything + ''' + assert (logits.ndim == 2) + if p < 1.0: + batchsize = logits.shape[0] + batch_idx = jnp.arange(batchsize)[:, None] + indices = jnp.argsort(logits, axis=1)[:, ::-1] + cumulative_probs = jnp.cumsum(jax.nn.softmax(logits[batch_idx, indices], axis=1), axis=1) + mask = jnp.concatenate([jnp.zeros((batchsize, 1)), # at least keep the leading one + (cumulative_probs > p)[:, :-1] + ], axis=1) + mask = mask.at[batch_idx, indices].set(mask) # logits to be dropped + logits = logits + jnp.where(mask, -1e10, 0.0) + + samples = jax.random.categorical(key, logits/temperature, axis=1) + return samples + +def sample_x(key, h_x, Kx, top_p, temperature, batchsize): + coord_types = 3*Kx + x_logit, loc, kappa = jnp.split(h_x[:, :coord_types], [Kx, 2*Kx], axis=-1) + key, key_k, key_x = jax.random.split(key, 3) + k = sample_top_p(key_k, x_logit, top_p, temperature) + loc = loc.reshape(batchsize, Kx)[jnp.arange(batchsize), k] + kappa = kappa.reshape(batchsize, Kx)[jnp.arange(batchsize), k] + x = sample_von_mises(key_x, loc, kappa/temperature, (batchsize,)) + x = (x+ jnp.pi)/(2.0*jnp.pi) # wrap into [0, 1] + return key, x + +@partial(jax.jit, static_argnums=(1, 3, 4, 5, 6, 7, 8, 9, 12, 14)) +def sample_crystal(key, transformer, params, n_max, batchsize, atom_types, wyck_types, Kx, Kl, g, w_mask, atom_mask, top_p, temperature, T1, constraints): + + def body_fn(i, state): + key, W, A, X, Y, Z, L = state + + # (1) W + w_logit = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i] # (batchsize, output_size) + w_logit = w_logit[:, :wyck_types] + + key, subkey = jax.random.split(key) + if w_mask is not None: + w_logit = w_logit.at[:, w_mask[i]].set(w_logit[:, w_mask[i]] + 1e10) + w = sample_top_p(subkey, w_logit, top_p, temperature) + W = W.at[:, i].set(w) + + # (2) A + h_al = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+1] # (batchsize, output_size) + a_logit = h_al[:, :atom_types] + + key, subkey = jax.random.split(key) + a_logit = a_logit + jnp.where(atom_mask[i, :], 1e10, 0.0) # enhance the probability of masked atoms (do not need to normalize since we only use it for sampling, not computing logp) + _temp = jax.lax.cond(i==0, + true_fun=lambda x: jnp.array(T1, dtype=float), + false_fun=lambda x: temperature, + operand=None) + _a = sample_top_p(subkey, a_logit, top_p, _temp) # use T1 for the first atom type + a = jax.lax.cond(constraints[i] < i, + lambda x, y: y, + lambda x, y: x, + _a, A[:, constraints[i]]) + A = A.at[:, i].set(a) + + lattice_params = h_al[:, atom_types:atom_types+Kl+2*6*Kl] + L = L.at[:, i].set(lattice_params) + + # (3) X + h_x = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+2] # (batchsize, output_size) + key, x = sample_x(key, h_x, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([x[:, None], + jnp.zeros((batchsize, 1)), + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + x = xyz[:, 0] + X = X.at[:, i].set(x) + + # (4) Y + h_y = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+3] # (batchsize, output_size) + key, y = sample_x(key, h_y, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, i][:, None], + y[:, None], + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + y = xyz[:, 1] + Y = Y.at[:, i].set(y) + + # (5) Z + h_z = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+4] # (batchsize, output_size) + key, z = sample_x(key, h_z, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, i][:, None], + Y[:, i][:, None], + z[:, None], + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + z = xyz[:, 2] + Z = Z.at[:, i].set(z) + + return key, W, A, X, Y, Z, L + + # we waste computation time by always working with the maximum length sequence, but we save compilation time + W = jnp.zeros((batchsize, n_max), dtype=int) + A = jnp.zeros((batchsize, n_max), dtype=int) + X = jnp.zeros((batchsize, n_max)) + Y = jnp.zeros((batchsize, n_max)) + Z = jnp.zeros((batchsize, n_max)) + L = jnp.zeros((batchsize, n_max, Kl+2*6*Kl)) # we accumulate lattice params and sample lattice after + + key, W, A, X, Y, Z, L = jax.lax.fori_loop(0, n_max, body_fn, (key, W, A, X, Y, Z, L)) + + M = mult_table[g-1, W] + num_sites = jnp.sum(A!=0, axis=1) + num_atoms = jnp.sum(M, axis=1) + + l_logit, mu, sigma = jnp.split(L[jnp.arange(batchsize), num_sites, :], [Kl, Kl+6*Kl], axis=-1) + + key, key_k, key_l = jax.random.split(key, 3) + # k is (batchsize, ) integer array whose value in [0, Kl) + k = sample_top_p(key_k, l_logit, top_p, temperature) + + mu = mu.reshape(batchsize, Kl, 6) + mu = mu[jnp.arange(batchsize), k] # (batchsize, 6) + sigma = sigma.reshape(batchsize, Kl, 6) + sigma = sigma[jnp.arange(batchsize), k] # (batchsize, 6) + L = jax.random.normal(key_l, (batchsize, 6)) * sigma*jnp.sqrt(temperature) + mu # (batchsize, 6) + + #scale length according to atom number since we did reverse of that when loading data + length, angle = jnp.split(L, 2, axis=-1) + length = length*num_atoms[:, None]**(1/3) + angle = angle * (180.0 / jnp.pi) # to deg + L = jnp.concatenate([length, angle], axis=-1) + + #impose space group constraint to lattice params + L = jax.vmap(symmetrize_lattice, (None, 0))(g, L) + + XYZ = jnp.concatenate([X[..., None], + Y[..., None], + Z[..., None] + ], + axis=-1) + + return XYZ, A, W, M, L + + +def make_update_lattice(transformer, params, atom_types, Kl, top_p, temperature): + + @jax.jit + def update_lattice(key, G, XYZ, A, W): + + num_sites = jnp.sum(A!=0, axis=1) # (batchsize, ) + M = jax.vmap(lambda g, w: mult_table[g-1, w], in_axes=(0, 0))(G, W) # (batchsize, n_max) + #num_atoms = jnp.sum(M) + batchsize = XYZ.shape[0] + + h = jax.vmap(transformer, in_axes=(None, None, 0, 0, 0, 0, 0, None))(params, key, G, XYZ, A, W, M, False) + + l_logit, mu, sigma = jax.vmap(lambda h, num_site: jnp.split(h[1::5][num_site, + atom_types:atom_types+Kl+2*6*Kl], [Kl, Kl+Kl*6], axis=-1), + in_axes=(0, 0))(h, num_sites) + + key, key_k, key_l = jax.random.split(key, 3) + # k is (batchsize, ) integer array whose value in [0, Kl) + k = sample_top_p(key_k, l_logit, top_p, temperature) + + mu = mu.reshape(batchsize, Kl, 6) + mu = mu[jnp.arange(batchsize), k] # (batchsize, 6) + sigma = sigma.reshape(batchsize, Kl, 6) + sigma = sigma[jnp.arange(batchsize), k] # (batchsize, 6) + L = jax.random.normal(key_l, (batchsize, 6)) * sigma*jnp.sqrt(temperature) + mu # (batchsize, 6) + + num_atoms = jnp.sum(M, axis=1) + #scale length according to atom number since we did reverse of that when loading data + length, angle = jnp.split(L, 2, axis=-1) + length = length*num_atoms[:, None]**(1/3) + angle = angle * (180.0 / jnp.pi) # to deg + L = jnp.concatenate([length, angle], axis=-1) + + #impose space group constraint to lattice params + L = jax.vmap(symmetrize_lattice, (0, 0))(G, L) + + return L + + return update_lattice \ No newline at end of file diff --git a/src/sample.py b/build/lib/crystalformerapp/src/simple_sample.py similarity index 97% rename from src/sample.py rename to build/lib/crystalformerapp/src/simple_sample.py index 44f4b8a..de419fc 100644 --- a/src/sample.py +++ b/build/lib/crystalformerapp/src/simple_sample.py @@ -2,9 +2,9 @@ import jax.numpy as jnp from functools import partial -from von_mises import sample_von_mises -from lattice import symmetrize_lattice -from wyckoff import mult_table, symops +from .von_mises import sample_von_mises +from .lattice import symmetrize_lattice +from .wyckoff import mult_table, symops def project_xyz(g, w, x, idx): ''' @@ -85,7 +85,7 @@ def body_fn(i, state): a_logit = a_logit + jnp.where(atom_mask, 1e10, 0.0) # enhance the probability of masked atoms (do not need to normalize since we only use it for sampling, not computing logp) _temp = jax.lax.cond(i==0, true_fun=lambda x: jnp.array(T1, dtype=float), - false_fun=lambda x: temperature, + false_fun=lambda x: jnp.array(temperature, dtype=float), operand=None) a = sample_top_p(subkey, a_logit, top_p, _temp) # use T1 for the first atom type A = A.at[:, i].set(a) @@ -180,7 +180,7 @@ def body_fn(i, state): a_logit = a_logit + jnp.where(atom_mask, 1e10, 0.0) # enhance the probability of masked atoms (do not need to normalize since we only use it for sampling, not computing logp) _temp = jax.lax.cond(i==0, true_fun=lambda x: jnp.array(T1, dtype=float), - false_fun=lambda x: temperature, + false_fun=lambda x: jnp.array(temperature, dtype=float), operand=None) a = sample_top_p(subkey, a_logit, top_p, _temp) # use T1 for the first atom type A = jnp.concatenate([A, a[:, None]], axis=1) @@ -273,4 +273,4 @@ def body_fn(i, state): ], axis=-1) - return XYZ, A, W, M, L + return XYZ, A, W, M, L \ No newline at end of file diff --git a/src/train.py b/build/lib/crystalformerapp/src/train.py similarity index 97% rename from src/train.py rename to build/lib/crystalformerapp/src/train.py index ea8b78d..1a8f377 100644 --- a/src/train.py +++ b/build/lib/crystalformerapp/src/train.py @@ -5,8 +5,8 @@ import optax import math -from utils import shuffle -import checkpoint +from .utils import shuffle +from .checkpoint import save_data def train(key, optimizer, opt_state, loss_fn, params, epoch_finished, epochs, batchsize, train_data, valid_data, path): @@ -98,7 +98,7 @@ def update(params, key, opt_state, data): "opt_state" : opt_state } ckpt_filename = os.path.join(path, "epoch_%06d.pkl" %(epoch)) - checkpoint.save_data(ckpt, ckpt_filename) + save_data(ckpt, ckpt_filename) print("Save checkpoint file: %s" % ckpt_filename) f.close() diff --git a/src/transformer.py b/build/lib/crystalformerapp/src/transformer.py similarity index 99% rename from src/transformer.py rename to build/lib/crystalformerapp/src/transformer.py index e3e5fcb..34b3134 100644 --- a/src/transformer.py +++ b/build/lib/crystalformerapp/src/transformer.py @@ -6,8 +6,8 @@ import haiku as hk import numpy as np -from attention import MultiHeadAttention -from wyckoff import wmax_table, dof0_table +from .attention import MultiHeadAttention +from .wyckoff import wmax_table, dof0_table def make_transformer(key, Nf, Kx, Kl, n_max, h0_size, num_layers, num_heads, key_size, model_size, embed_size, atom_types, wyck_types, dropout_rate, widening_factor=4, sigmamin=1e-3): diff --git a/src/utils.py b/build/lib/crystalformerapp/src/utils.py similarity index 99% rename from src/utils.py rename to build/lib/crystalformerapp/src/utils.py index 3a4b563..2696403 100644 --- a/src/utils.py +++ b/build/lib/crystalformerapp/src/utils.py @@ -9,8 +9,8 @@ import multiprocessing import os -from wyckoff import mult_table -from elements import element_list +from .wyckoff import mult_table +from .elements import element_list @jax.vmap def sort_atoms(W, A, X): diff --git a/src/von_mises.py b/build/lib/crystalformerapp/src/von_mises.py similarity index 100% rename from src/von_mises.py rename to build/lib/crystalformerapp/src/von_mises.py diff --git a/src/wyckoff.py b/build/lib/crystalformerapp/src/wyckoff.py similarity index 97% rename from src/wyckoff.py rename to build/lib/crystalformerapp/src/wyckoff.py index b4b43a4..0716e07 100644 --- a/src/wyckoff.py +++ b/build/lib/crystalformerapp/src/wyckoff.py @@ -33,7 +33,11 @@ def from_xyz_str(xyz_str: str): return np.concatenate( [rot_matrix, trans[:, None]], axis=1) # (3, 4) -df = pd.read_csv(os.path.join(os.path.dirname(__file__), '../data/wyckoff_list.csv')) +current_dir = os.path.dirname(__file__) +data_dir = os.path.abspath(os.path.join(current_dir, '../data')) +file_path = os.path.join(data_dir, 'wyckoff_list.csv') +df = pd.read_csv(file_path) + df['Wyckoff Positions'] = df['Wyckoff Positions'].apply(eval) # convert string to list wyckoff_positions = df['Wyckoff Positions'].tolist() diff --git a/crystalformerapp/__init__.py b/crystalformerapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/crystalformerapp/build/lib/crystalformerapp/__init__.py b/crystalformerapp/build/lib/crystalformerapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/crystalformerapp/build/lib/crystalformerapp/op.py b/crystalformerapp/build/lib/crystalformerapp/op.py new file mode 100644 index 0000000..28520ca --- /dev/null +++ b/crystalformerapp/build/lib/crystalformerapp/op.py @@ -0,0 +1,180 @@ +import gdown +import sys +sys.path.append('./src/') +import yaml +import os +import jax +import jax.numpy as jnp +from jax.flatten_util import ravel_pytree +# from hydra import initialize, compose +import numpy as np +import ipywidgets as widgets +from pymatgen.core import Structure, Lattice +from weas_widget import WeasWidget + +from sample import sample_crystal, make_update_lattice +from elements import element_dict, element_list +from scripts.awl2struct import get_struct_from_lawx +from utils import letter_to_number +from mcmc import make_mcmc_step +from loss import make_loss_fn + +import checkpoint +from transformer import make_transformer + +output = "epoch_009800.pkl" + + + +with open("model/config.yaml") as stream: + args = yaml.safe_load(stream) + +class MyObject: + def __init__(self, d=None): + for key, value in d.items(): + setattr(self, key, value) + +args = MyObject(args) +key = jax.random.PRNGKey(42) +params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + 4, 8, + 32, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + 0.3) + +print("\n========== Load checkpoint==========") +restore_path = "./" +ckpt_filename, epoch_finished = checkpoint.find_ckpt_filename(restore_path) +if ckpt_filename is not None: + print("Load checkpoint file: %s, epoch finished: %g" %(ckpt_filename, epoch_finished)) + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] +else: + print("No checkpoint file found. Start from scratch.") + +print ("# of transformer params", ravel_pytree(params)[0].size) + +jax.config.update("jax_enable_x64", True) # to get off compilation warning, and to prevent sample nan lattice +loss_fn, logp_fn = make_loss_fn(args.n_max, args.atom_types, args.wyck_types, args.Kx, args.Kl, transformer, args.lamb_a, args.lamb_w, args.lamb_l) + + +def run_op( + spacegroup, elements, wyckoff, + temperature, seed, T1, nsweeps, + tempdir +): + top_p = 1 + mc_width = 0.1 + n_sample = 1 + + elements = elements.split() + if elements is not None: + idx = [element_dict[e] for e in elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + print ('sampling structure formed by these elements:', elements) + print (atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) # we will do nothing to a_logit in sampling + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + + wyckoff = wyckoff.split() + if wyckoff is not None: + idx = [letter_to_number(w) for w in wyckoff] + # padding 0 until the length is args.n_max + w_mask = idx + [0]*(args.n_max -len(idx)) + print(w_mask) + w_mask = jnp.array(w_mask, dtype=int) + print ('sampling structure formed by these Wyckoff positions:', wyckoff) + print (w_mask) + else: + w_mask = None # we will do nothing to w_logit in sampling + + temperature = jnp.array(temperature, dtype=float) + constraints = jnp.arange(0, args.n_max, 1) + + mc_steps = nsweeps * args.n_max + print("mc_steps", mc_steps) + mcmc = make_mcmc_step(params, n_max=args.n_max, atom_types=args.atom_types, atom_mask=atom_mask, constraints=constraints) + update_lattice = make_update_lattice(transformer, params, args.atom_types, args.Kl, args.top_p, args.temperature) + + key = jax.random.PRNGKey(seed) + key, subkey = jax.random.split(key) + XYZ, A, W, M, L = sample_crystal(subkey, transformer, params, args.n_max, n_sample, args.atom_types, args.wyck_types, args.Kx, args.Kl, spacegroup, w_mask, atom_mask, top_p, temperature, T1, constraints) + G = jnp.array([spacegroup for i in range(len(L))]) + x = (G, L, XYZ, A, W) + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x, key=subkey, mc_steps=mc_steps, mc_width=mc_width) + print("acc", acc) + + G, L, XYZ, A, W = x + key, subkey = jax.random.split(key) + L = update_lattice(subkey, G, XYZ, A, W) + + + XYZ = np.array(XYZ) + A = np.array(A) + W = np.array(W) + L = np.array(L) + G = np.array(G) + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + + output_file = os.path.join(tempdir, "pred_struct.cif") + structures[0].to(output_file) + + return output_file + + +def run_op_gpu( + spacegroup, elements, wyckoff, + temperature, seed, T1, nsweeps, + access_key, project_id, machine_type, + tempdir +): + from bohrium_open_sdk import OpenSDK + client = OpenSDK(access_key=access_key) + + cmd = ( + f"python -c \"" + f"from my_module import run_op; " + f"run_op('{spacegroup}', '{elements}', '{wyckoff}', " + f"{temperature}, {seed}, {T1}, {nsweeps}, '{tempdir}')" + f"\"" + ) + + resp = client.job.submit( + project_id=project_id, + machine_type=machine_type, + job_name="crystalformer", + cmd=cmd, + image_address="registry.dp.tech/dptech/prod-19853/crystal-former:0.0.1", + out_files=["*cif"], + dataset_path=[], + work_dir="./workplace", + job_group_id=0, + ) + + print(resp) + + return 0 + +run_op_gpu( + spacegroup=225, + elements="C", + wyckoff="a", + temperature=10, + seed=10, + T1=10, + nsweeps=20, + access_key="5e542859d81f4f05a2e94e4d15d9fc1f", + project_id=27666, + machine_type="1 * NVIDIA T4_16g" +) \ No newline at end of file diff --git a/crystalformerapp/build/lib/crystalformerapp/op_gpu.py b/crystalformerapp/build/lib/crystalformerapp/op_gpu.py new file mode 100644 index 0000000..9458c44 --- /dev/null +++ b/crystalformerapp/build/lib/crystalformerapp/op_gpu.py @@ -0,0 +1,5 @@ +from op import run_op +from bohrium_open_sdk import OpenSDK + +input_params +run_op() \ No newline at end of file diff --git a/crystalformerapp/build/lib/crystalformerapp/simple_op.py b/crystalformerapp/build/lib/crystalformerapp/simple_op.py new file mode 100644 index 0000000..45bb849 --- /dev/null +++ b/crystalformerapp/build/lib/crystalformerapp/simple_op.py @@ -0,0 +1,101 @@ +import sys +sys.path.append('./src/') +import jax +import jax.numpy as jnp +from hydra import initialize, compose +import checkpoint +from transformer import make_transformer +import numpy as np +from pymatgen.core import Structure +from time import time +from pymatgen.io.ase import AseAtomsAdaptor +from ase.io import write +from simple_sample import sample_crystal +from elements import element_dict +from scripts.awl2struct import get_struct_from_lawx + +import os +import io +import tempfile +import shutil + +def configure_jax(): + jax.config.update("jax_enable_x64", True) + +def initialize_parameters(args, seed=42): + key = jax.random.PRNGKey(seed) + params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + 4, 8, + 32, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + 0.3) + return params, transformer + +def load_checkpoint(restore_path): + print("\n========== Load checkpoint==========") + ckpt_filename, epoch_finished = checkpoint.find_ckpt_filename(restore_path) + if ckpt_filename is not None: + print(f"Load checkpoint file: {ckpt_filename}, epoch finished: {epoch_finished}") + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] + else: + print("No checkpoint file found. Start from scratch.") + params = None + return params + +def generate_crystal(spacegroup, elements, temperature, seed, params, transformer, args): + print(f"Generating with spacegroup={spacegroup}, elements={elements}, temperature={temperature}") + top_p = 1 + n_sample = 1 + elements = elements.split() + if elements: + idx = [element_dict[e] for e in elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) + + key = jax.random.PRNGKey(seed) + key, subkey = jax.random.split(key) + start_time = time() + XYZ, A, W, M, L = sample_crystal( + subkey, + transformer, + params, + args.n_max, + n_sample, + args.atom_types, + args.wyck_types, + args.Kx, args.Kl, + spacegroup, None, + atom_mask, top_p, + temperature, + temperature, + args.use_foriloop) + + end_time = time() + print(f"Execution time: {end_time - start_time}") + + XYZ, A, W, L = map(np.array, (XYZ, A, W, L)) + G = np.array([spacegroup for _ in range(len(L))]) + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + atoms_list = [AseAtomsAdaptor().get_atoms(struct) for struct in structures] + + return atoms_list + +def run_crystalformer(spacegroup, elements, temperature, seed, tempdir): + configure_jax() + with initialize(version_base=None, config_path="./model"): + args = compose(config_name="config") + params, transformer = initialize_parameters(args) + restore_path = "/share/" + + params = load_checkpoint(restore_path) if params is None else params + atoms_list = generate_crystal(spacegroup, elements, temperature, seed, params, transformer, args) + outputPath = os.path.join(tempdir, "pred_struct.cif") + write(outputPath, atoms_list[-1], format="cif") + + return outputPath \ No newline at end of file diff --git a/crystalformerapp/data/__init__.py b/crystalformerapp/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/data/cif/Ac2AgSi.cif b/crystalformerapp/data/cif/Ac2AgSi.cif similarity index 100% rename from data/cif/Ac2AgSi.cif rename to crystalformerapp/data/cif/Ac2AgSi.cif diff --git a/data/cif/Ac2CuRh.cif b/crystalformerapp/data/cif/Ac2CuRh.cif similarity index 100% rename from data/cif/Ac2CuRh.cif rename to crystalformerapp/data/cif/Ac2CuRh.cif diff --git a/data/cif/Ac2HgIn.cif b/crystalformerapp/data/cif/Ac2HgIn.cif similarity index 100% rename from data/cif/Ac2HgIn.cif rename to crystalformerapp/data/cif/Ac2HgIn.cif diff --git a/data/cif/AcBi2K.cif b/crystalformerapp/data/cif/AcBi2K.cif similarity index 100% rename from data/cif/AcBi2K.cif rename to crystalformerapp/data/cif/AcBi2K.cif diff --git a/data/cif/AuInPm2.cif b/crystalformerapp/data/cif/AuInPm2.cif similarity index 100% rename from data/cif/AuInPm2.cif rename to crystalformerapp/data/cif/AuInPm2.cif diff --git a/data/cif/CaPaRu2.cif b/crystalformerapp/data/cif/CaPaRu2.cif similarity index 100% rename from data/cif/CaPaRu2.cif rename to crystalformerapp/data/cif/CaPaRu2.cif diff --git a/data/cif/InPm2Tl.cif b/crystalformerapp/data/cif/InPm2Tl.cif similarity index 100% rename from data/cif/InPm2Tl.cif rename to crystalformerapp/data/cif/InPm2Tl.cif diff --git a/data/cif/InTb.cif b/crystalformerapp/data/cif/InTb.cif similarity index 100% rename from data/cif/InTb.cif rename to crystalformerapp/data/cif/InTb.cif diff --git a/data/cif/Ir2LuPm.cif b/crystalformerapp/data/cif/Ir2LuPm.cif similarity index 100% rename from data/cif/Ir2LuPm.cif rename to crystalformerapp/data/cif/Ir2LuPm.cif diff --git a/data/cif/PdPm2Zn.cif b/crystalformerapp/data/cif/PdPm2Zn.cif similarity index 100% rename from data/cif/PdPm2Zn.cif rename to crystalformerapp/data/cif/PdPm2Zn.cif diff --git a/data/cif/_idx0.cif b/crystalformerapp/data/cif/_idx0.cif similarity index 100% rename from data/cif/_idx0.cif rename to crystalformerapp/data/cif/_idx0.cif diff --git a/data/cif/_idx1.cif b/crystalformerapp/data/cif/_idx1.cif similarity index 100% rename from data/cif/_idx1.cif rename to crystalformerapp/data/cif/_idx1.cif diff --git a/data/cif/_idx2.cif b/crystalformerapp/data/cif/_idx2.cif similarity index 100% rename from data/cif/_idx2.cif rename to crystalformerapp/data/cif/_idx2.cif diff --git a/data/cif/_idx3.cif b/crystalformerapp/data/cif/_idx3.cif similarity index 100% rename from data/cif/_idx3.cif rename to crystalformerapp/data/cif/_idx3.cif diff --git a/crystalformerapp/data/mini.csv b/crystalformerapp/data/mini.csv new file mode 100644 index 0000000..08b1309 --- /dev/null +++ b/crystalformerapp/data/mini.csv @@ -0,0 +1,1025 @@ +,material_id,cif,formula,heat_all,heat_ref,dir_gap,ind_gap +996,3961,"# generated using pymatgen +data_TiOsNOF +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.05632160 +_cell_length_b 4.05632160 +_cell_length_c 4.05632160 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural TiOsNOF +_chemical_formula_sum 'Ti1 Os1 N1 O1 F1' +_cell_volume 66.74168089 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Ti Ti0 1 -0.39078906 0.00000000 0.00000000 1 + Os Os1 1 0.77619935 0.50000000 0.50000000 1 + F F2 1 0.41528400 0.00000000 0.50000000 1 + N N3 1 0.74200080 0.50000000 0.00000000 1 + O O4 1 0.23143281 0.50000000 0.50000000 1 +",TiOsOFN,1.16,1.4383314936574307,0.0,0.0 +13356,11922,"# generated using pymatgen +data_TlRuO2F +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.34903456 +_cell_length_b 4.34903456 +_cell_length_c 4.34903456 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural TlRuO2F +_chemical_formula_sum 'Tl1 Ru1 O2 F1' +_cell_volume 82.25808174 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Ru Ru0 1 0.00033725 0.00000000 0.00000000 1 + Tl Tl1 1 0.50576730 0.50000000 0.50000000 1 + F F2 1 0.49946523 0.00000000 0.50000000 1 + O O3 1 0.49976346 0.50000000 0.00000000 1 + O O4 1 0.00473415 0.50000000 0.50000000 1 +",RuTlO2F,1.66,1.604895907125141,0.0,0.0 +17389,6694,"# generated using pymatgen +data_BiPtN2O +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.29844890 +_cell_length_b 4.29844890 +_cell_length_c 4.29844890 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural BiPtN2O +_chemical_formula_sum 'Bi1 Pt1 N2 O1' +_cell_volume 79.42099162 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Pt Pt0 1 0.29997257 -0.00000000 -0.00000000 1 + Bi Bi1 1 0.53993421 0.50000000 0.50000000 1 + N N2 1 0.36834345 -0.00000000 0.50000000 1 + N N3 1 0.36834345 0.50000000 -0.00000000 1 + O O4 1 0.01082605 0.50000000 0.50000000 1 +",PtBiON2,1.56,1.5696792181375208,0.0,0.0 +5951,3335,"# generated using pymatgen +data_VRhNOF +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.02270344 +_cell_length_b 4.02270344 +_cell_length_c 4.02270344 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural VRhNOF +_chemical_formula_sum 'V1 Rh1 N1 O1 F1' +_cell_volume 65.09596203 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + V V0 1 0.00049375 0.00000000 0.00000000 1 + Rh Rh1 1 0.50448113 0.50000000 0.50000000 1 + F F2 1 0.49993299 0.00000000 0.50000000 1 + N N3 1 0.49968514 0.50000000 0.00000000 1 + O O4 1 0.00455817 0.50000000 0.50000000 1 +",VRhOFN,1.56,1.5667132600301656,0.0,0.0 +10279,18565,"# generated using pymatgen +data_CuAsN3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.78270614 +_cell_length_b 3.78270614 +_cell_length_c 3.78270614 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural CuAsN3 +_chemical_formula_sum 'Cu1 As1 N3' +_cell_volume 54.12623443 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Cu Cu0 1 0.00000000 0.00000000 0.00000000 1 + As As1 1 0.50000000 0.50000000 0.50000000 1 + N N2 1 0.50000000 0.00000000 0.50000000 1 + N N3 1 0.50000000 0.50000000 0.00000000 1 + N N4 1 0.00000000 0.50000000 0.50000000 1 +",CuAsN3,1.96,1.957101879221944,0.0,0.0 +11311,2330,"# generated using pymatgen +data_LiSiNO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.58451331 +_cell_length_b 3.58451331 +_cell_length_c 3.58451331 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural LiSiNO2 +_chemical_formula_sum 'Li1 Si1 N1 O2' +_cell_volume 46.05646406 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Si Si0 1 0.28531504 0.00000000 0.00000000 1 + Li Li1 1 0.55085454 0.50000000 0.50000000 1 + N N2 1 0.15366418 -0.00000000 0.50000000 1 + O O3 1 0.47407905 0.50000000 -0.00000000 1 + O O4 1 0.03555206 0.50000000 0.50000000 1 +",SiLiO2N,1.62,1.6147826784711228,0.0,0.0 +16344,3821,"# generated using pymatgen +data_PbWNOF +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.38797299 +_cell_length_b 4.38797299 +_cell_length_c 4.38797299 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural PbWNOF +_chemical_formula_sum 'Pb1 W1 N1 O1 F1' +_cell_volume 84.48737868 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + W W0 1 0.00040354 0.00000000 0.00000000 1 + Pb Pb1 1 0.50596338 0.50000000 0.50000000 1 + F F2 1 0.49949773 0.00000000 0.50000000 1 + N N3 1 0.49964437 0.50000000 0.00000000 1 + O O4 1 0.00486688 0.50000000 0.50000000 1 +",WPbOFN,2.24,2.2377835057585265,0.0,0.0 +7053,15919,"# generated using pymatgen +data_HgSbO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.07884264 +_cell_length_b 4.07884264 +_cell_length_c 4.07884264 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural HgSbO3 +_chemical_formula_sum 'Hg1 Sb1 O3' +_cell_volume 67.85953090 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Hg Hg0 1 0.00191037 0.00000000 0.00000000 1 + Sb Sb1 1 0.50332499 0.50000000 0.50000000 1 + O O2 1 0.50101089 0.00000000 0.50000000 1 + O O3 1 0.50101089 0.50000000 0.00000000 1 + O O4 1 0.00311160 0.50000000 0.50000000 1 +",HgSbO3,0.8,0.8014469506629801,0.0,0.0 +3259,8303,"# generated using pymatgen +data_BeHgSO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.09651573 +_cell_length_b 4.09651573 +_cell_length_c 4.09651573 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural BeHgSO2 +_chemical_formula_sum 'Be1 Hg1 S1 O2' +_cell_volume 68.74543769 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Hg Hg0 1 -0.04157757 0.00000000 0.00000000 1 + Be Be1 1 0.58392302 0.50000000 0.50000000 1 + S S2 1 0.37464796 0.00000000 0.50000000 1 + O O3 1 0.60862477 0.50000000 0.00000000 1 + O O4 1 -0.02473635 0.50000000 0.50000000 1 +",HgBeO2S,1.48,1.483830550929222,0.0,0.0 +250,4426,"# generated using pymatgen +data_InMoNOF +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.25550490 +_cell_length_b 4.25550490 +_cell_length_c 4.25550490 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural InMoNOF +_chemical_formula_sum 'In1 Mo1 N1 O1 F1' +_cell_volume 77.06430832 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Mo Mo0 1 0.00260664 0.00000000 0.00000000 1 + In In1 1 0.49980599 0.50000000 0.50000000 1 + F F2 1 0.49977465 0.00000000 0.50000000 1 + N N3 1 0.50122382 0.50000000 0.00000000 1 + O O4 1 0.00009054 0.50000000 0.50000000 1 +",MoInOFN,1.5,1.476769419762198,0.0,0.0 +13728,10279,"# generated using pymatgen +data_CuAsSO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.34141159 +_cell_length_b 4.34141159 +_cell_length_c 4.34141159 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural CuAsSO2 +_chemical_formula_sum 'Cu1 As1 S1 O2' +_cell_volume 81.82629423 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Cu Cu0 1 0.29436098 0.00000000 0.00000000 1 + As As1 1 0.54962780 0.50000000 0.50000000 1 + S S2 1 0.30689326 0.00000000 0.50000000 1 + O O3 1 0.42784540 0.50000000 0.00000000 1 + O O4 1 -0.05515372 0.50000000 0.50000000 1 +",CuAsO2S,0.82,0.8286985492154443,0.0,0.0 +8370,13521,"# generated using pymatgen +data_MnSbO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.08114631 +_cell_length_b 4.08114631 +_cell_length_c 4.08114631 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural MnSbO3 +_chemical_formula_sum 'Mn1 Sb1 O3' +_cell_volume 67.97457380 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Mn Mn0 1 0.18175892 0.00000000 0.00000000 1 + Sb Sb1 1 0.52701483 0.50000000 0.50000000 1 + O O2 1 0.43719431 -0.00000000 0.50000000 1 + O O3 1 0.43719431 0.50000000 0.00000000 1 + O O4 1 0.00744286 0.50000000 0.50000000 1 +",MnSbO3,0.56,0.5649610136211486,0.0,0.0 +18472,7085,"# generated using pymatgen +data_SiBiN2O +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.76973394 +_cell_length_b 3.76973394 +_cell_length_c 3.76973394 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural SiBiN2O +_chemical_formula_sum 'Si1 Bi1 N2 O1' +_cell_volume 53.57128946 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Bi Bi0 1 0.00330320 0.00000000 0.00000000 1 + Si Si1 1 0.50386450 0.50000000 0.50000000 1 + N N2 1 0.50099633 -0.00000000 0.50000000 1 + N N3 1 0.50099633 0.50000000 -0.00000000 1 + O O4 1 0.00099404 0.50000000 0.50000000 1 +",BiSiON2,0.98,0.9788049920179888,0.0,0.0 +4246,10041,"# generated using pymatgen +data_CsAuSO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.69930588 +_cell_length_b 4.69930588 +_cell_length_c 4.69930588 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural CsAuSO2 +_chemical_formula_sum 'Cs1 Au1 S1 O2' +_cell_volume 103.77700771 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Cs Cs0 1 -0.02586677 0.00000000 -0.00000000 1 + Au Au1 1 0.56910341 0.50000000 0.50000000 1 + S S2 1 0.44763128 -0.00000000 0.50000000 1 + O O3 1 0.50469533 0.50000000 -0.00000000 1 + O O4 1 0.00702974 0.50000000 0.50000000 1 +",CsAuO2S,1.82,1.4596104420268066,0.0,0.0 +14619,16593,"# generated using pymatgen +data_CsRbN3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.92220919 +_cell_length_b 4.92220919 +_cell_length_c 4.92220919 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural CsRbN3 +_chemical_formula_sum 'Cs1 Rb1 N3' +_cell_volume 119.25598990 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Cs Cs0 1 0.00029164 -0.00000000 -0.00000000 1 + Rb Rb1 1 0.50369172 0.50000000 0.50000000 1 + N N2 1 0.50008052 0.00000000 0.50000000 1 + N N3 1 0.50008052 0.50000000 0.00000000 1 + N N4 1 0.00533110 0.50000000 0.50000000 1 +",CsRbN3,4.24,3.0217855966120064,0.0,0.0 +17564,4401,"# generated using pymatgen +data_RbVNOF +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.13138105 +_cell_length_b 4.13138105 +_cell_length_c 4.13138105 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural RbVNOF +_chemical_formula_sum 'Rb1 V1 N1 O1 F1' +_cell_volume 70.51569000 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Rb Rb0 1 0.00153426 0.00000000 0.00000000 1 + V V1 1 0.50873207 0.50000000 0.50000000 1 + F F2 1 0.50025732 0.00000000 0.50000000 1 + N N3 1 0.50282254 0.50000000 0.00000000 1 + O O4 1 -0.00402422 0.50000000 0.50000000 1 +",RbVOFN,0.82,0.5683944681248796,0.0,0.0 +297,18212,"# generated using pymatgen +data_RuPbN3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.02252384 +_cell_length_b 4.02252384 +_cell_length_c 4.02252384 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural RuPbN3 +_chemical_formula_sum 'Ru1 Pb1 N3' +_cell_volume 65.08724365 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Pb Pb0 1 0.00946453 -0.00000000 -0.00000000 1 + Ru Ru1 1 0.50200850 0.50000000 0.50000000 1 + N N2 1 0.50031472 -0.00000000 0.50000000 1 + N N3 1 0.50031472 0.50000000 0.00000000 1 + N N4 1 -0.00077991 0.50000000 0.50000000 1 +",PbRuN3,1.32,1.321174534250617,0.0,0.0 +14148,16252,"# generated using pymatgen +data_NiSnN3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.87477550 +_cell_length_b 3.87477550 +_cell_length_c 3.87477550 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural NiSnN3 +_chemical_formula_sum 'Ni1 Sn1 N3' +_cell_volume 58.17543447 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Sn Sn0 1 0.12294783 -0.00000000 -0.00000000 1 + Ni Ni1 1 0.52373828 0.50000000 0.50000000 1 + N N2 1 0.40141303 -0.00000000 0.50000000 1 + N N3 1 0.40141303 0.50000000 0.00000000 1 + N N4 1 -0.02066346 0.50000000 0.50000000 1 +",SnNiN3,1.44,1.4158645070312077,0.0,0.0 +3384,14985,"# generated using pymatgen +data_ZrSnO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.19179975 +_cell_length_b 4.19179975 +_cell_length_c 4.19179975 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural ZrSnO3 +_chemical_formula_sum 'Zr1 Sn1 O3' +_cell_volume 73.65488930 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Sn Sn0 1 0.00112253 0.00000000 -0.00000000 1 + Zr Zr1 1 0.50628152 0.50000000 0.50000000 1 + O O2 1 0.49983605 -0.00000000 0.50000000 1 + O O3 1 0.49983605 0.50000000 0.00000000 1 + O O4 1 0.00314090 0.50000000 0.50000000 1 +",SnZrO3,0.2,0.2031985142453635,4.5,4.5 +4748,5581,"# generated using pymatgen +data_KSrN2O +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.78437990 +_cell_length_b 4.78437990 +_cell_length_c 4.78437990 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural KSrN2O +_chemical_formula_sum 'K1 Sr1 N2 O1' +_cell_volume 109.51584828 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + K K0 1 0.00055819 -0.00000000 0.00000000 1 + Sr Sr1 1 0.50549028 0.50000000 0.50000000 1 + N N2 1 0.49974383 -0.00000000 0.50000000 1 + N N3 1 0.49974383 0.50000000 0.00000000 1 + O O4 1 0.00524112 0.50000000 0.50000000 1 +",KSrON2,2.74,1.8447953632359424,0.0,0.0 +11188,6204,"# generated using pymatgen +data_GaRhN2O +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.88107152 +_cell_length_b 3.88107152 +_cell_length_c 3.88107152 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural GaRhN2O +_chemical_formula_sum 'Ga1 Rh1 N2 O1' +_cell_volume 58.45947874 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Rh Rh0 1 0.00042918 0.00000000 0.00000000 1 + Ga Ga1 1 0.50551749 0.50000000 0.50000000 1 + N N2 1 0.49964712 0.00000000 0.50000000 1 + N N3 1 0.49964712 0.50000000 0.00000000 1 + O O4 1 0.00457519 0.50000000 0.50000000 1 +",RhGaON2,1.94,1.9336281965708344,0.0,0.0 +13714,17535,"# generated using pymatgen +data_TiGaN3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.96015407 +_cell_length_b 3.96015407 +_cell_length_c 3.96015407 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural TiGaN3 +_chemical_formula_sum 'Ti1 Ga1 N3' +_cell_volume 62.10638464 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Ga Ga0 1 0.00052032 0.00000000 0.00000000 1 + Ti Ti1 1 0.50503093 0.50000000 0.50000000 1 + N N2 1 0.49997047 0.00000000 0.50000000 1 + N N3 1 0.49997047 0.50000000 0.00000000 1 + N N4 1 0.00426856 0.50000000 0.50000000 1 +",GaTiN3,1.5,1.4954036690340125,0.0,0.0 +10470,15077,"# generated using pymatgen +data_KSbO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.00199472 +_cell_length_b 4.00199472 +_cell_length_c 4.00199472 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural KSbO3 +_chemical_formula_sum 'K1 Sb1 O3' +_cell_volume 64.09579419 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + K K0 1 0.00180281 0.00000000 0.00000000 1 + Sb Sb1 1 0.50303387 0.50000000 0.50000000 1 + O O2 1 0.50130346 0.00000000 0.50000000 1 + O O3 1 0.50130346 0.50000000 0.00000000 1 + O O4 1 0.00297873 0.50000000 0.50000000 1 +",KSbO3,0.16,0.1626791039352852,1.4,0.7 +9093,4815,"# generated using pymatgen +data_LaTaNOF +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.66932400 +_cell_length_b 4.66932400 +_cell_length_c 4.66932400 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural LaTaNOF +_chemical_formula_sum 'La1 Ta1 N1 O1 F1' +_cell_volume 101.80334085 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Ta Ta0 1 0.00056845 0.00000000 0.00000000 1 + La La1 1 0.50511685 0.50000000 0.50000000 1 + F F2 1 0.49949325 0.00000000 0.50000000 1 + N N3 1 0.50024548 0.50000000 0.00000000 1 + O O4 1 0.00500002 0.50000000 0.50000000 1 +",TaLaOFN,2.36,2.355973892406253,0.0,0.0 +18922,5691,"# generated using pymatgen +data_BeAsN2O +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.76405920 +_cell_length_b 3.76405920 +_cell_length_c 3.76405920 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural BeAsN2O +_chemical_formula_sum 'Be1 As1 N2 O1' +_cell_volume 53.32972389 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Be Be0 1 0.46427455 0.00000000 0.00000000 1 + As As1 1 0.28508148 0.50000000 0.50000000 1 + N N2 1 0.39177199 0.00000000 0.50000000 1 + N N3 1 0.39177199 0.50000000 0.00000000 1 + O O4 1 -0.18227202 0.50000000 0.50000000 1 +",BeAsON2,1.56,1.5663584690811887,0.0,0.0 +16468,15533,"# generated using pymatgen +data_HfAlO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.11586298 +_cell_length_b 4.11586298 +_cell_length_c 4.11586298 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural HfAlO3 +_chemical_formula_sum 'Hf1 Al1 O3' +_cell_volume 69.72406914 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Al Al0 1 0.23811871 0.00000000 0.00000000 1 + Hf Hf1 1 0.52762345 0.50000000 0.50000000 1 + O O2 1 0.41935511 0.00000000 0.50000000 1 + O O3 1 0.41935511 0.50000000 0.00000000 1 + O O4 1 -0.00556074 0.50000000 0.50000000 1 +",AlHfO3,0.68,0.6862625785891282,0.0,0.0 +13703,15912,"# generated using pymatgen +data_LiAlO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.71706533 +_cell_length_b 3.71706533 +_cell_length_c 3.71706533 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural LiAlO3 +_chemical_formula_sum 'Li1 Al1 O3' +_cell_volume 51.35711085 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Li Li0 1 0.00082585 -0.00000000 0.00000000 1 + Al Al1 1 0.50185368 0.50000000 0.50000000 1 + O O2 1 0.50179165 0.00000000 0.50000000 1 + O O3 1 0.50179165 0.50000000 0.00000000 1 + O O4 1 0.00196253 0.50000000 0.50000000 1 +",LiAlO3,0.84,0.8420509083791196,0.0,0.0 +8109,7839,"# generated using pymatgen +data_CoReN2O +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.71654707 +_cell_length_b 3.71654707 +_cell_length_c 3.71654707 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural CoReN2O +_chemical_formula_sum 'Co1 Re1 N2 O1' +_cell_volume 51.33563194 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Re Re0 1 0.17877368 0.00000000 0.00000000 1 + Co Co1 1 0.53485591 0.50000000 0.50000000 1 + N N2 1 0.43333029 0.00000000 0.50000000 1 + N N3 1 0.43333029 0.50000000 0.00000000 1 + O O4 1 0.00460981 0.50000000 0.50000000 1 +",ReCoON2,1.32,1.3028812799876337,0.0,0.0 +2457,14938,"# generated using pymatgen +data_CoWO3 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.78209403 +_cell_length_b 3.78209403 +_cell_length_c 3.78209403 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural CoWO3 +_chemical_formula_sum 'Co1 W1 O3' +_cell_volume 54.09996281 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + W W0 1 0.09356780 0.00000000 -0.00000000 1 + Co Co1 1 0.43551539 0.50000000 0.50000000 1 + O O2 1 0.36321747 -0.00000000 0.50000000 1 + O O3 1 0.36321747 0.50000000 -0.00000000 1 + O O4 1 -0.07737414 0.50000000 0.50000000 1 +",WCoO3,1.2,1.206806540824913,0.0,0.0 +7215,1762,"# generated using pymatgen +data_BeAsNO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 3.64264267 +_cell_length_b 3.64264267 +_cell_length_c 3.64264267 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural BeAsNO2 +_chemical_formula_sum 'Be1 As1 N1 O2' +_cell_volume 48.33366343 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + As As0 1 0.18006878 0.00000000 0.00000000 1 + Be Be1 1 0.50295577 0.50000000 0.50000000 1 + N N2 1 0.42020007 0.00000000 0.50000000 1 + O O3 1 0.42690466 0.50000000 0.00000000 1 + O O4 1 -0.05067727 0.50000000 0.50000000 1 +",AsBeO2N,1.42,1.4246259776182495,0.0,0.0 +14254,13259,"# generated using pymatgen +data_BaRuO2F +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.23865725 +_cell_length_b 4.23865725 +_cell_length_c 4.23865725 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural BaRuO2F +_chemical_formula_sum 'Ba1 Ru1 O2 F1' +_cell_volume 76.15262877 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Ba Ba0 1 0.00096878 0.00000000 0.00000000 1 + Ru Ru1 1 0.50393304 0.50000000 0.50000000 1 + F F2 1 0.50043428 0.00000000 0.50000000 1 + O O3 1 0.50006739 0.50000000 0.00000000 1 + O O4 1 0.00410809 0.50000000 0.50000000 1 +",BaRuO2F,0.7,0.6585058717105248,0.0,0.0 +14805,8875,"# generated using pymatgen +data_YInSO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.43392593 +_cell_length_b 4.43392593 +_cell_length_c 4.43392593 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural YInSO2 +_chemical_formula_sum 'Y1 In1 S1 O2' +_cell_volume 87.16964973 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Y Y0 1 -0.08932572 0.00000000 0.00000000 1 + In In1 1 0.57043078 0.50000000 0.50000000 1 + S S2 1 0.36299416 0.00000000 0.50000000 1 + O O3 1 0.69224078 0.50000000 0.00000000 1 + O O4 1 0.04031656 0.50000000 0.50000000 1 +",YInO2S,0.82,0.815674617560694,2.6,2.2 diff --git a/crystalformerapp/data/wyckoff_list.csv b/crystalformerapp/data/wyckoff_list.csv new file mode 100644 index 0000000..24890c8 --- /dev/null +++ b/crystalformerapp/data/wyckoff_list.csv @@ -0,0 +1,231 @@ +Space Group,Wyckoff Positions +1,"[['x, y, z']]" +2,"[['x, y, z', '-x, -y, -z'], ['1/2, 1/2, 1/2'], ['0, 1/2, 1/2'], ['1/2, 0, 1/2'], ['1/2, 1/2, 0'], ['1/2, 0, 0'], ['0, 1/2, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +3,"[['x, y, z', '-x, y, -z'], ['1/2, y, 1/2'], ['1/2, y, 0'], ['0, y, 1/2'], ['0, y, 0']]" +4,"[['x, y, z', '-x, y+1/2, -z']]" +5,"[['x, y, z', '-x, y, -z', 'x+1/2, y+1/2, z', '-x+1/2, y+1/2, -z'], ['0, y, 1/2', '1/2, y+1/2, 1/2'], ['0, y, 0', '1/2, y+1/2, 0']]" +6,"[['x, y, z', 'x, -y, z'], ['x, 1/2, z'], ['x, 0, z']]" +7,"[['x, y, z', 'x, -y, z+1/2']]" +8,"[['x, y, z', 'x, -y, z', 'x+1/2, y+1/2, z', 'x+1/2, -y+1/2, z'], ['x, 0, z', 'x+1/2, 1/2, z']]" +9,"[['x, y, z', 'x, -y, z+1/2', 'x+1/2, y+1/2, z', 'x+1/2, -y+1/2, z+1/2']]" +10,"[['x, y, z', '-x, y, -z', '-x, -y, -z', 'x, -y, z'], ['x, 1/2, z', '-x, 1/2, -z'], ['x, 0, z', '-x, 0, -z'], ['1/2, y, 1/2', '1/2, -y, 1/2'], ['0, y, 1/2', '0, -y, 1/2'], ['1/2, y, 0', '1/2, -y, 0'], ['0, y, 0', '0, -y, 0'], ['1/2, 1/2, 1/2'], ['1/2, 0, 1/2'], ['0, 1/2, 1/2'], ['1/2, 1/2, 0'], ['1/2, 0, 0'], ['0, 0, 1/2'], ['0, 1/2, 0'], ['0, 0, 0']]" +11,"[['x, y, z', '-x, y+1/2, -z', '-x, -y, -z', 'x, -y+1/2, z'], ['x, 1/4, z', '-x, 3/4, -z'], ['1/2, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 1/2', '0, 1/2, 1/2'], ['1/2, 0, 0', '1/2, 1/2, 0'], ['0, 0, 0', '0, 1/2, 0']]" +12,"[['x, y, z', '-x, y, -z', '-x, -y, -z', 'x, -y, z', 'x+1/2, y+1/2, z', '-x+1/2, y+1/2, -z', '-x+1/2, -y+1/2, -z', 'x+1/2, -y+1/2, z'], ['x, 0, z', '-x, 0, -z', 'x+1/2, 1/2, z', '-x+1/2, 1/2, -z'], ['0, y, 1/2', '0, -y, 1/2', '1/2, y+1/2, 1/2', '1/2, -y+1/2, 1/2'], ['0, y, 0', '0, -y, 0', '1/2, y+1/2, 0', '1/2, -y+1/2, 0'], ['1/4, 1/4, 1/2', '3/4, 1/4, 1/2', '3/4, 3/4, 1/2', '5/4, 3/4, 1/2'], ['1/4, 1/4, 0', '3/4, 1/4, 0', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['0, 1/2, 1/2', '1/2, 1, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 1/2, 0', '1/2, 1, 0'], ['0, 0, 0', '1/2, 1/2, 0']]" +13,"[['x, y, z', '-x, y, -z+1/2', '-x, -y, -z', 'x, -y, z+1/2'], ['1/2, y, 1/4', '1/2, -y, 3/4'], ['0, y, 1/4', '0, -y, 3/4'], ['1/2, 0, 0', '1/2, 0, 1/2'], ['0, 1/2, 0', '0, 1/2, 1/2'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2']]" +14,"[['x, y, z', '-x, y+1/2, -z+1/2', '-x, -y, -z', 'x, -y+1/2, z+1/2'], ['1/2, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 1/2', '0, 1/2, 0'], ['1/2, 0, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 1/2, 1/2']]" +15,"[['x, y, z', '-x, y, -z+1/2', '-x, -y, -z', 'x, -y, z+1/2', 'x+1/2, y+1/2, z', '-x+1/2, y+1/2, -z+1/2', '-x+1/2, -y+1/2, -z', 'x+1/2, -y+1/2, z+1/2'], ['0, y, 1/4', '0, -y, 3/4', '1/2, y+1/2, 1/4', '1/2, -y+1/2, 3/4'], ['1/4, 1/4, 1/2', '3/4, 1/4, 0', '3/4, 3/4, 1/2', '5/4, 3/4, 0'], ['1/4, 1/4, 0', '3/4, 1/4, 1/2', '3/4, 3/4, 0', '5/4, 3/4, 1/2'], ['0, 1/2, 0', '0, 1/2, 1/2', '1/2, 1, 0', '1/2, 1, 1/2'], ['0, 0, 0', '0, 0, 1/2', '1/2, 1/2, 0', '1/2, 1/2, 1/2']]" +16,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 1/2, z', '0, 1/2, -z'], ['1/2, 0, z', '1/2, 0, -z'], ['0, 0, z', '0, 0, -z'], ['1/2, y, 1/2', '1/2, -y, 1/2'], ['1/2, y, 0', '1/2, -y, 0'], ['0, y, 1/2', '0, -y, 1/2'], ['0, y, 0', '0, -y, 0'], ['x, 1/2, 1/2', '-x, 1/2, 1/2'], ['x, 1/2, 0', '-x, 1/2, 0'], ['x, 0, 1/2', '-x, 0, 1/2'], ['x, 0, 0', '-x, 0, 0'], ['1/2, 1/2, 1/2'], ['0, 1/2, 1/2'], ['1/2, 0, 1/2'], ['1/2, 1/2, 0'], ['0, 0, 1/2'], ['0, 1/2, 0'], ['1/2, 0, 0'], ['0, 0, 0']]" +17,"[['x, y, z', '-x, -y, z+1/2', '-x, y, -z+1/2', 'x, -y, -z'], ['1/2, y, 1/4', '1/2, -y, 3/4'], ['0, y, 1/4', '0, -y, 3/4'], ['x, 1/2, 0', '-x, 1/2, 1/2'], ['x, 0, 0', '-x, 0, 1/2']]" +18,"[['x, y, z', '-x, -y, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z'], ['0, 1/2, z', '1/2, 0, -z'], ['0, 0, z', '1/2, 1/2, -z']]" +19,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z']]" +20,"[['x, y, z', '-x, -y, z+1/2', '-x, y, -z+1/2', 'x, -y, -z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z'], ['0, y, 1/4', '0, -y, 3/4', '1/2, y+1/2, 1/4', '1/2, -y+1/2, 3/4'], ['x, 0, 0', '-x, 0, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 1/2']]" +21,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z'], ['1/4, 1/4, z', '3/4, 1/4, -z', '3/4, 3/4, z', '5/4, 3/4, -z'], ['0, 1/2, z', '0, 1/2, -z', '1/2, 1, z', '1/2, 1, -z'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z', '1/2, 1/2, -z'], ['0, y, 1/2', '0, -y, 1/2', '1/2, y+1/2, 1/2', '1/2, -y+1/2, 1/2'], ['0, y, 0', '0, -y, 0', '1/2, y+1/2, 0', '1/2, -y+1/2, 0'], ['x, 0, 1/2', '-x, 0, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2'], ['x, 0, 0', '-x, 0, 0', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 1/2', '1, 1/2, 1/2'], ['0, 1/2, 0', '1/2, 1, 0'], ['0, 0, 0', '1/2, 1/2, 0']]" +22,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', 'x, 3/4, 3/4', '-x, 5/4, 3/4', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4'], ['1/4, y, 1/4', '3/4, -y, 1/4', '1/4, y+1/2, 3/4', '3/4, -y+1/2, 3/4', '3/4, y, 3/4', '5/4, -y, 3/4', '3/4, y+1/2, 1/4', '5/4, -y+1/2, 1/4'], ['1/4, 1/4, z', '3/4, 1/4, -z', '1/4, 3/4, z+1/2', '3/4, 3/4, -z+1/2', '3/4, 1/4, z+1/2', '5/4, 1/4, -z+1/2', '3/4, 3/4, z', '5/4, 3/4, -z'], ['0, 0, z', '0, 0, -z', '0, 1/2, z+1/2', '0, 1/2, -z+1/2', '1/2, 0, z+1/2', '1/2, 0, -z+1/2', '1/2, 1/2, z', '1/2, 1/2, -z'], ['0, y, 0', '0, -y, 0', '0, y+1/2, 1/2', '0, -y+1/2, 1/2', '1/2, y, 1/2', '1/2, -y, 1/2', '1/2, y+1/2, 0', '1/2, -y+1/2, 0'], ['x, 0, 0', '-x, 0, 0', 'x, 1/2, 1/2', '-x, 1/2, 1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0'], ['1/4, 1/4, 3/4', '1/4, 3/4, 5/4', '3/4, 1/4, 5/4', '3/4, 3/4, 3/4'], ['1/4, 1/4, 1/4', '1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['0, 0, 1/2', '0, 1/2, 1', '1/2, 0, 1', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +23,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2'], ['0, 1/2, z', '0, 1/2, -z', '1/2, 1, z+1/2', '1/2, 1, -z+1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['1/2, y, 0', '1/2, -y, 0', '1, y+1/2, 1/2', '1, -y+1/2, 1/2'], ['0, y, 0', '0, -y, 0', '1/2, y+1/2, 1/2', '1/2, -y+1/2, 1/2'], ['x, 0, 1/2', '-x, 0, 1/2', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1'], ['x, 0, 0', '-x, 0, 0', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2'], ['0, 1/2, 0', '1/2, 1, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['1/2, 0, 0', '1, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +24,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2'], ['0, 1/4, z', '0, 3/4, -z+1/2', '1/2, 3/4, z+1/2', '1/2, 5/4, -z+1'], ['1/4, y, 0', '1/4, -y, 1/2', '3/4, y+1/2, 1/2', '3/4, -y+1/2, 1'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4']]" +25,"[['x, y, z', '-x, -y, z', 'x, -y, z', '-x, y, z'], ['1/2, y, z', '1/2, -y, z'], ['0, y, z', '0, -y, z'], ['x, 1/2, z', '-x, 1/2, z'], ['x, 0, z', '-x, 0, z'], ['1/2, 1/2, z'], ['1/2, 0, z'], ['0, 1/2, z'], ['0, 0, z']]" +26,"[['x, y, z', '-x, -y, z+1/2', 'x, -y, z+1/2', '-x, y, z'], ['1/2, y, z', '1/2, -y, z+1/2'], ['0, y, z', '0, -y, z+1/2']]" +27,"[['x, y, z', '-x, -y, z', 'x, -y, z+1/2', '-x, y, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2'], ['1/2, 0, z', '1/2, 0, z+1/2'], ['0, 1/2, z', '0, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +28,"[['x, y, z', '-x, -y, z', 'x+1/2, -y, z', '-x+1/2, y, z'], ['1/4, y, z', '3/4, -y, z'], ['0, 1/2, z', '1/2, 1/2, z'], ['0, 0, z', '1/2, 0, z']]" +29,"[['x, y, z', '-x, -y, z+1/2', 'x+1/2, -y, z', '-x+1/2, y, z+1/2']]" +30,"[['x, y, z', '-x, -y, z', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2'], ['1/2, 0, z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 1/2, z+1/2']]" +31,"[['x, y, z', '-x+1/2, -y, z+1/2', 'x+1/2, -y, z+1/2', '-x, y, z'], ['0, y, z', '1/2, -y, z+1/2']]" +32,"[['x, y, z', '-x, -y, z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z'], ['0, 1/2, z', '1/2, 0, z'], ['0, 0, z', '1/2, 1/2, z']]" +33,"[['x, y, z', '-x, -y, z+1/2', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z+1/2']]" +34,"[['x, y, z', '-x, -y, z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['0, 1/2, z', '1/2, 0, z+1/2'], ['0, 0, z', '1/2, 1/2, z+1/2']]" +35,"[['x, y, z', '-x, -y, z', 'x, -y, z', '-x, y, z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z'], ['0, y, z', '0, -y, z', '1/2, y+1/2, z', '1/2, -y+1/2, z'], ['x, 0, z', '-x, 0, z', 'x+1/2, 1/2, z', '-x+1/2, 1/2, z'], ['1/4, 1/4, z', '1/4, 3/4, z', '3/4, 3/4, z', '3/4, 5/4, z'], ['0, 1/2, z', '1/2, 1, z'], ['0, 0, z', '1/2, 1/2, z']]" +36,"[['x, y, z', '-x, -y, z+1/2', 'x, -y, z+1/2', '-x, y, z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z'], ['0, y, z', '0, -y, z+1/2', '1/2, y+1/2, z', '1/2, -y+1/2, z+1/2']]" +37,"[['x, y, z', '-x, -y, z', 'x, -y, z+1/2', '-x, y, z+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['1/4, 1/4, z', '1/4, 3/4, z+1/2', '3/4, 3/4, z', '3/4, 5/4, z+1/2'], ['0, 1/2, z', '0, 1/2, z+1/2', '1/2, 1, z', '1/2, 1, z+1/2'], ['0, 0, z', '0, 0, z+1/2', '1/2, 1/2, z', '1/2, 1/2, z+1/2']]" +38,"[['x, y, z', '-x, -y, z', 'x, -y, z', '-x, y, z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2'], ['1/2, y, z', '1/2, -y, z', '1/2, y+1/2, z+1/2', '1/2, -y+1/2, z+1/2'], ['0, y, z', '0, -y, z', '0, y+1/2, z+1/2', '0, -y+1/2, z+1/2'], ['x, 0, z', '-x, 0, z', 'x, 1/2, z+1/2', '-x, 1/2, z+1/2'], ['1/2, 0, z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 1/2, z+1/2']]" +39,"[['x, y, z', '-x, -y, z', 'x, -y+1/2, z', '-x, y+1/2, z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', 'x, -y+1, z+1/2', '-x, y+1, z+1/2'], ['x, 1/4, z', '-x, 3/4, z', 'x, 3/4, z+1/2', '-x, 5/4, z+1/2'], ['1/2, 0, z', '1/2, 1/2, z', '1/2, 1/2, z+1/2', '1/2, 1, z+1/2'], ['0, 0, z', '0, 1/2, z', '0, 1/2, z+1/2', '0, 1, z+1/2']]" +40,"[['x, y, z', '-x, -y, z', 'x+1/2, -y, z', '-x+1/2, y, z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['1/4, y, z', '3/4, -y, z', '1/4, y+1/2, z+1/2', '3/4, -y+1/2, z+1/2'], ['0, 0, z', '1/2, 0, z', '0, 1/2, z+1/2', '1/2, 1/2, z+1/2']]" +41,"[['x, y, z', '-x, -y, z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', 'x+1/2, -y+1, z+1/2', '-x+1/2, y+1, z+1/2'], ['0, 0, z', '1/2, 1/2, z', '0, 1/2, z+1/2', '1/2, 1, z+1/2']]" +42,"[['x, y, z', '-x, -y, z', 'x, -y, z', '-x, y, z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', 'x+1/2, -y, z+1/2', '-x+1/2, y, z+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z'], ['x, 0, z', '-x, 0, z', 'x, 1/2, z+1/2', '-x, 1/2, z+1/2', 'x+1/2, 0, z+1/2', '-x+1/2, 0, z+1/2', 'x+1/2, 1/2, z', '-x+1/2, 1/2, z'], ['0, y, z', '0, -y, z', '0, y+1/2, z+1/2', '0, -y+1/2, z+1/2', '1/2, y, z+1/2', '1/2, -y, z+1/2', '1/2, y+1/2, z', '1/2, -y+1/2, z'], ['1/4, 1/4, z', '1/4, 3/4, z', '1/4, 3/4, z+1/2', '1/4, 5/4, z+1/2', '3/4, 1/4, z+1/2', '3/4, 3/4, z+1/2', '3/4, 3/4, z', '3/4, 5/4, z'], ['0, 0, z', '0, 1/2, z+1/2', '1/2, 0, z+1/2', '1/2, 1/2, z']]" +43,"[['x, y, z', '-x, -y, z', 'x+1/4, -y+1/4, z+1/4', '-x+1/4, y+1/4, z+1/4', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', 'x+1/4, -y+3/4, z+3/4', '-x+1/4, y+3/4, z+3/4', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', 'x+3/4, -y+1/4, z+3/4', '-x+3/4, y+1/4, z+3/4', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', 'x+3/4, -y+3/4, z+1/4', '-x+3/4, y+3/4, z+1/4'], ['0, 0, z', '1/4, 1/4, z+1/4', '0, 1/2, z+1/2', '1/4, 3/4, z+3/4', '1/2, 0, z+1/2', '3/4, 1/4, z+3/4', '1/2, 1/2, z', '3/4, 3/4, z+1/4']]" +44,"[['x, y, z', '-x, -y, z', 'x, -y, z', '-x, y, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['0, y, z', '0, -y, z', '1/2, y+1/2, z+1/2', '1/2, -y+1/2, z+1/2'], ['x, 0, z', '-x, 0, z', 'x+1/2, 1/2, z+1/2', '-x+1/2, 1/2, z+1/2'], ['0, 1/2, z', '1/2, 1, z+1/2'], ['0, 0, z', '1/2, 1/2, z+1/2']]" +45,"[['x, y, z', '-x, -y, z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'x+1, -y+1, z+1/2', '-x+1, y+1, z+1/2'], ['0, 1/2, z', '1/2, 0, z', '1/2, 1, z+1/2', '1, 1/2, z+1/2'], ['0, 0, z', '1/2, 1/2, z', '1/2, 1/2, z+1/2', '1, 1, z+1/2']]" +46,"[['x, y, z', '-x, -y, z', 'x+1/2, -y, z', '-x+1/2, y, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'x+1, -y+1/2, z+1/2', '-x+1, y+1/2, z+1/2'], ['1/4, y, z', '3/4, -y, z', '3/4, y+1/2, z+1/2', '5/4, -y+1/2, z+1/2'], ['0, 0, z', '1/2, 0, z', '1/2, 1/2, z+1/2', '1, 1/2, z+1/2']]" +47,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z'], ['x, y, 1/2', '-x, -y, 1/2', '-x, y, 1/2', 'x, -y, 1/2'], ['x, y, 0', '-x, -y, 0', '-x, y, 0', 'x, -y, 0'], ['x, 1/2, z', '-x, 1/2, z', '-x, 1/2, -z', 'x, 1/2, -z'], ['x, 0, z', '-x, 0, z', '-x, 0, -z', 'x, 0, -z'], ['1/2, y, z', '1/2, -y, z', '1/2, y, -z', '1/2, -y, -z'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['1/2, 0, z', '1/2, 0, -z'], ['0, 1/2, z', '0, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['1/2, y, 1/2', '1/2, -y, 1/2'], ['1/2, y, 0', '1/2, -y, 0'], ['0, y, 1/2', '0, -y, 1/2'], ['0, y, 0', '0, -y, 0'], ['x, 1/2, 1/2', '-x, 1/2, 1/2'], ['x, 1/2, 0', '-x, 1/2, 0'], ['x, 0, 1/2', '-x, 0, 1/2'], ['x, 0, 0', '-x, 0, 0'], ['1/2, 1/2, 1/2'], ['0, 1/2, 1/2'], ['1/2, 1/2, 0'], ['0, 1/2, 0'], ['1/2, 0, 1/2'], ['0, 0, 1/2'], ['1/2, 0, 0'], ['0, 0, 0']]" +48,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x+1/2, y, -z+1/2', 'x, -y+1/2, -z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y, z+1/2', '-x, y+1/2, z+1/2'], ['1/4, 3/4, z', '1/4, 3/4, -z+1/2', '3/4, 1/4, -z', '3/4, 1/4, z+1/2'], ['1/4, 1/4, z', '1/4, 1/4, -z+1/2', '3/4, 3/4, -z', '3/4, 3/4, z+1/2'], ['3/4, y, 1/4', '3/4, -y+1/2, 1/4', '1/4, -y, 3/4', '1/4, y+1/2, 3/4'], ['1/4, y, 1/4', '1/4, -y+1/2, 1/4', '3/4, -y, 3/4', '3/4, y+1/2, 3/4'], ['x, 1/4, 3/4', '-x+1/2, 1/4, 3/4', '-x, 3/4, 1/4', 'x+1/2, 3/4, 1/4'], ['x, 1/4, 1/4', '-x+1/2, 1/4, 1/4', '-x, 3/4, 3/4', 'x+1/2, 3/4, 3/4'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['1/2, 1/2, 1/2', '0, 0, 1/2', '0, 1/2, 0', '1/2, 0, 0'], ['1/4, 3/4, 1/4', '3/4, 1/4, 3/4'], ['1/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['3/4, 1/4, 1/4', '1/4, 3/4, 3/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4']]" +49,"[['x, y, z', '-x, -y, z', '-x, y, -z+1/2', 'x, -y, -z+1/2', '-x, -y, -z', 'x, y, -z', 'x, -y, z+1/2', '-x, y, z+1/2'], ['x, y, 0', '-x, -y, 0', '-x, y, 1/2', 'x, -y, 1/2'], ['1/2, 0, z', '1/2, 0, -z+1/2', '1/2, 0, -z', '1/2, 0, z+1/2'], ['0, 1/2, z', '0, 1/2, -z+1/2', '0, 1/2, -z', '0, 1/2, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, -z+1/2', '1/2, 1/2, -z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2'], ['1/2, y, 1/4', '1/2, -y, 1/4', '1/2, -y, 3/4', '1/2, y, 3/4'], ['0, y, 1/4', '0, -y, 1/4', '0, -y, 3/4', '0, y, 3/4'], ['x, 1/2, 1/4', '-x, 1/2, 1/4', '-x, 1/2, 3/4', 'x, 1/2, 3/4'], ['x, 0, 1/4', '-x, 0, 1/4', '-x, 0, 3/4', 'x, 0, 3/4'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 1/2, 1/4', '0, 1/2, 3/4'], ['1/2, 0, 1/4', '1/2, 0, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['1/2, 0, 0', '1/2, 0, 1/2'], ['0, 1/2, 0', '0, 1/2, 1/2'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2']]" +50,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x+1/2, y, -z', 'x, -y+1/2, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y, z', '-x, y+1/2, z'], ['1/4, 3/4, z', '1/4, 3/4, -z', '3/4, 1/4, -z', '3/4, 1/4, z'], ['1/4, 1/4, z', '1/4, 1/4, -z', '3/4, 3/4, -z', '3/4, 3/4, z'], ['1/4, y, 1/2', '1/4, -y+1/2, 1/2', '3/4, -y, 1/2', '3/4, y+1/2, 1/2'], ['1/4, y, 0', '1/4, -y+1/2, 0', '3/4, -y, 0', '3/4, y+1/2, 0'], ['x, 1/4, 1/2', '-x+1/2, 1/4, 1/2', '-x, 3/4, 1/2', 'x+1/2, 3/4, 1/2'], ['x, 1/4, 0', '-x+1/2, 1/4, 0', '-x, 3/4, 0', 'x+1/2, 3/4, 0'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 0', '0, 1/2, 0'], ['1/4, 1/4, 1/2', '3/4, 3/4, 1/2'], ['3/4, 1/4, 1/2', '1/4, 3/4, 1/2'], ['3/4, 1/4, 0', '1/4, 3/4, 0'], ['1/4, 1/4, 0', '3/4, 3/4, 0']]" +51,"[['x, y, z', '-x+1/2, -y, z', '-x, y, -z', 'x+1/2, -y, -z', '-x, -y, -z', 'x+1/2, y, -z', 'x, -y, z', '-x+1/2, y, z'], ['1/4, y, z', '1/4, -y, z', '3/4, y, -z', '3/4, -y, -z'], ['x, 1/2, z', '-x+1/2, 1/2, z', '-x, 1/2, -z', 'x+1/2, 1/2, -z'], ['x, 0, z', '-x+1/2, 0, z', '-x, 0, -z', 'x+1/2, 0, -z'], ['0, y, 1/2', '1/2, -y, 1/2', '0, -y, 1/2', '1/2, y, 1/2'], ['0, y, 0', '1/2, -y, 0', '0, -y, 0', '1/2, y, 0'], ['1/4, 1/2, z', '3/4, 1/2, -z'], ['1/4, 0, z', '3/4, 0, -z'], ['0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 0, 1/2'], ['0, 1/2, 0', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 0, 0']]" +52,"[['x, y, z', '-x+1/2, -y, z', '-x+1/2, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', '-x, -y, -z', 'x+1/2, y, -z', 'x+1/2, -y+1/2, z+1/2', '-x, y+1/2, z+1/2'], ['x, 1/4, 1/4', '-x+1/2, 3/4, 1/4', '-x, 3/4, 3/4', 'x+1/2, 1/4, 3/4'], ['1/4, 0, z', '1/4, 1/2, -z+1/2', '3/4, 0, -z', '3/4, 1/2, z+1/2'], ['0, 0, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '0, 1/2, 0'], ['0, 0, 0', '1/2, 0, 0', '1/2, 1/2, 1/2', '0, 1/2, 1/2']]" +53,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x, -y, -z', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x+1/2, -y, z+1/2', '-x, y, z'], ['0, y, z', '1/2, -y, z+1/2', '1/2, y, -z+1/2', '0, -y, -z'], ['1/4, y, 1/4', '1/4, -y, 3/4', '3/4, -y, 3/4', '3/4, y, 1/4'], ['x, 1/2, 0', '-x+1/2, 1/2, 1/2', '-x, 1/2, 0', 'x+1/2, 1/2, 1/2'], ['x, 0, 0', '-x+1/2, 0, 1/2', '-x, 0, 0', 'x+1/2, 0, 1/2'], ['0, 1/2, 0', '1/2, 1/2, 1/2'], ['1/2, 1/2, 0', '0, 1/2, 1/2'], ['1/2, 0, 0', '0, 0, 1/2'], ['0, 0, 0', '1/2, 0, 1/2']]" +54,"[['x, y, z', '-x+1/2, -y, z', '-x, y, -z+1/2', 'x+1/2, -y, -z+1/2', '-x, -y, -z', 'x+1/2, y, -z', 'x, -y, z+1/2', '-x+1/2, y, z+1/2'], ['1/4, 1/2, z', '3/4, 1/2, -z+1/2', '3/4, 1/2, -z', '1/4, 1/2, z+1/2'], ['1/4, 0, z', '3/4, 0, -z+1/2', '3/4, 0, -z', '1/4, 0, z+1/2'], ['0, y, 1/4', '1/2, -y, 1/4', '0, -y, 3/4', '1/2, y, 3/4'], ['0, 1/2, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 0, 0', '0, 0, 1/2', '1/2, 0, 1/2']]" +55,"[['x, y, z', '-x, -y, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', '-x, -y, -z', 'x, y, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z'], ['x, y, 1/2', '-x, -y, 1/2', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2'], ['x, y, 0', '-x, -y, 0', '-x+1/2, y+1/2, 0', 'x+1/2, -y+1/2, 0'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, -z', '1/2, 0, z'], ['0, 0, z', '1/2, 1/2, -z', '0, 0, -z', '1/2, 1/2, z'], ['0, 1/2, 1/2', '1/2, 0, 1/2'], ['0, 1/2, 0', '1/2, 0, 0'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0']]" +56,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x, y+1/2, -z+1/2', 'x+1/2, -y, -z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x, -y+1/2, z+1/2', '-x+1/2, y, z+1/2'], ['1/4, 3/4, z', '3/4, 1/4, -z+1/2', '3/4, 1/4, -z', '1/4, 3/4, z+1/2'], ['1/4, 1/4, z', '3/4, 3/4, -z+1/2', '3/4, 3/4, -z', '1/4, 1/4, z+1/2'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '0, 1/2, 0', '1/2, 0, 0'], ['0, 0, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2']]" +57,"[['x, y, z', '-x, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z', '-x, -y, -z', 'x, y, -z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z'], ['x, y, 1/4', '-x, -y, 3/4', '-x, y+1/2, 1/4', 'x, -y+1/2, 3/4'], ['x, 1/4, 0', '-x, 3/4, 1/2', '-x, 3/4, 0', 'x, 1/4, 1/2'], ['1/2, 0, 0', '1/2, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '0, 0, 1/2', '0, 1/2, 1/2', '0, 1/2, 0']]" +58,"[['x, y, z', '-x, -y, z', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', '-x, -y, -z', 'x, y, -z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['x, y, 0', '-x, -y, 0', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, -z+1/2', '0, 1/2, -z', '1/2, 0, z+1/2'], ['0, 0, z', '1/2, 1/2, -z+1/2', '0, 0, -z', '1/2, 1/2, z+1/2'], ['0, 1/2, 1/2', '1/2, 0, 0'], ['0, 1/2, 0', '1/2, 0, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +59,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x, y+1/2, -z', 'x+1/2, -y, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x, -y+1/2, z', '-x+1/2, y, z'], ['x, 1/4, z', '-x+1/2, 1/4, z', '-x, 3/4, -z', 'x+1/2, 3/4, -z'], ['1/4, y, z', '1/4, -y+1/2, z', '3/4, y+1/2, -z', '3/4, -y, -z'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '0, 1/2, 1/2', '1/2, 0, 1/2'], ['0, 0, 0', '1/2, 1/2, 0', '0, 1/2, 0', '1/2, 0, 0'], ['1/4, 3/4, z', '3/4, 1/4, -z'], ['1/4, 1/4, z', '3/4, 3/4, -z']]" +60,"[['x, y, z', '-x+1/2, -y+1/2, z+1/2', '-x, y, -z+1/2', 'x+1/2, -y+1/2, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z+1/2', 'x, -y, z+1/2', '-x+1/2, y+1/2, z'], ['0, y, 1/4', '1/2, -y+1/2, 3/4', '0, -y, 3/4', '1/2, y+1/2, 1/4'], ['0, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 0, 0'], ['0, 0, 0', '1/2, 1/2, 1/2', '0, 0, 1/2', '1/2, 1/2, 0']]" +61,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x, -y+1/2, z+1/2', '-x+1/2, y+1/2, z'], ['0, 0, 1/2', '1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 0']]" +62,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z', 'x+1/2, -y+1/2, -z+1/2', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x, -y+1/2, z', '-x+1/2, y+1/2, z+1/2'], ['x, 1/4, z', '-x+1/2, 3/4, z+1/2', '-x, 3/4, -z', 'x+1/2, 1/4, -z+1/2'], ['0, 0, 1/2', '1/2, 0, 0', '0, 1/2, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 0, 1/2', '0, 1/2, 0', '1/2, 1/2, 1/2']]" +63,"[['x, y, z', '-x, -y, z+1/2', '-x, y, -z+1/2', 'x, -y, -z', '-x, -y, -z', 'x, y, -z+1/2', 'x, -y, z+1/2', '-x, y, z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z'], ['x, y, 1/4', '-x, -y, 3/4', '-x, y, 1/4', 'x, -y, 3/4', 'x+1/2, y+1/2, 1/4', '-x+1/2, -y+1/2, 3/4', '-x+1/2, y+1/2, 1/4', 'x+1/2, -y+1/2, 3/4'], ['0, y, z', '0, -y, z+1/2', '0, y, -z+1/2', '0, -y, -z', '1/2, y+1/2, z', '1/2, -y+1/2, z+1/2', '1/2, y+1/2, -z+1/2', '1/2, -y+1/2, -z'], ['x, 0, 0', '-x, 0, 1/2', '-x, 0, 0', 'x, 0, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 0', 'x+1/2, 1/2, 1/2'], ['1/4, 1/4, 0', '3/4, 3/4, 1/2', '3/4, 1/4, 1/2', '1/4, 3/4, 0', '3/4, 3/4, 0', '5/4, 5/4, 1/2', '5/4, 3/4, 1/2', '3/4, 5/4, 0'], ['0, y, 1/4', '0, -y, 3/4', '1/2, y+1/2, 1/4', '1/2, -y+1/2, 3/4'], ['0, 1/2, 0', '0, 1/2, 1/2', '1/2, 1, 0', '1/2, 1, 1/2'], ['0, 0, 0', '0, 0, 1/2', '1/2, 1/2, 0', '1/2, 1/2, 1/2']]" +64,"[['x, y, z', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y, -z', '-x, -y, -z', 'x, y+1/2, -z+1/2', 'x, -y+1/2, z+1/2', '-x, y, z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1, z+1/2', '-x+1/2, y+1, -z+1/2', 'x+1/2, -y+1/2, -z', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1, -z+1/2', 'x+1/2, -y+1, z+1/2', '-x+1/2, y+1/2, z'], ['0, y, z', '0, -y+1/2, z+1/2', '0, y+1/2, -z+1/2', '0, -y, -z', '1/2, y+1/2, z', '1/2, -y+1, z+1/2', '1/2, y+1, -z+1/2', '1/2, -y+1/2, -z'], ['1/4, y, 1/4', '3/4, -y+1/2, 3/4', '3/4, -y, 3/4', '1/4, y+1/2, 1/4', '3/4, y+1/2, 1/4', '5/4, -y+1, 3/4', '5/4, -y+1/2, 3/4', '3/4, y+1, 1/4'], ['x, 0, 0', '-x, 1/2, 1/2', '-x, 0, 0', 'x, 1/2, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1, 1/2', '-x+1/2, 1/2, 0', 'x+1/2, 1, 1/2'], ['1/4, 1/4, 0', '3/4, 1/4, 1/2', '3/4, 3/4, 1/2', '1/4, 3/4, 0', '3/4, 3/4, 0', '5/4, 3/4, 1/2', '5/4, 5/4, 1/2', '3/4, 5/4, 0'], ['1/2, 0, 0', '1/2, 1/2, 1/2', '1, 1/2, 0', '1, 1, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 1/2, 0', '1/2, 1, 1/2']]" +65,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z'], ['x, y, 1/2', '-x, -y, 1/2', '-x, y, 1/2', 'x, -y, 1/2', 'x+1/2, y+1/2, 1/2', '-x+1/2, -y+1/2, 1/2', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2'], ['x, y, 0', '-x, -y, 0', '-x, y, 0', 'x, -y, 0', 'x+1/2, y+1/2, 0', '-x+1/2, -y+1/2, 0', '-x+1/2, y+1/2, 0', 'x+1/2, -y+1/2, 0'], ['x, 0, z', '-x, 0, z', '-x, 0, -z', 'x, 0, -z', 'x+1/2, 1/2, z', '-x+1/2, 1/2, z', '-x+1/2, 1/2, -z', 'x+1/2, 1/2, -z'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', '1/2, y+1/2, z', '1/2, -y+1/2, z', '1/2, y+1/2, -z', '1/2, -y+1/2, -z'], ['1/4, 1/4, z', '3/4, 1/4, -z', '3/4, 3/4, -z', '1/4, 3/4, z', '3/4, 3/4, z', '5/4, 3/4, -z', '5/4, 5/4, -z', '3/4, 5/4, z'], ['0, 1/2, z', '0, 1/2, -z', '1/2, 1, z', '1/2, 1, -z'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z', '1/2, 1/2, -z'], ['0, y, 1/2', '0, -y, 1/2', '1/2, y+1/2, 1/2', '1/2, -y+1/2, 1/2'], ['0, y, 0', '0, -y, 0', '1/2, y+1/2, 0', '1/2, -y+1/2, 0'], ['x, 0, 1/2', '-x, 0, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2'], ['x, 0, 0', '-x, 0, 0', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0'], ['1/4, 1/4, 1/2', '3/4, 1/4, 1/2', '3/4, 3/4, 1/2', '5/4, 3/4, 1/2'], ['1/4, 1/4, 0', '3/4, 1/4, 0', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 1/2', '1, 1/2, 1/2'], ['1/2, 0, 0', '1, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 0']]" +66,"[['x, y, z', '-x, -y, z', '-x, y, -z+1/2', 'x, -y, -z+1/2', '-x, -y, -z', 'x, y, -z', 'x, -y, z+1/2', '-x, y, z+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['x, y, 0', '-x, -y, 0', '-x, y, 1/2', 'x, -y, 1/2', 'x+1/2, y+1/2, 0', '-x+1/2, -y+1/2, 0', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2'], ['1/4, 1/4, z', '3/4, 1/4, -z+1/2', '3/4, 3/4, -z', '1/4, 3/4, z+1/2', '3/4, 3/4, z', '5/4, 3/4, -z+1/2', '5/4, 5/4, -z', '3/4, 5/4, z+1/2'], ['0, 1/2, z', '0, 1/2, -z+1/2', '0, 1/2, -z', '0, 1/2, z+1/2', '1/2, 1, z', '1/2, 1, -z+1/2', '1/2, 1, -z', '1/2, 1, z+1/2'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2', '1/2, 1/2, z', '1/2, 1/2, -z+1/2', '1/2, 1/2, -z', '1/2, 1/2, z+1/2'], ['0, y, 1/4', '0, -y, 1/4', '0, -y, 3/4', '0, y, 3/4', '1/2, y+1/2, 1/4', '1/2, -y+1/2, 1/4', '1/2, -y+1/2, 3/4', '1/2, y+1/2, 3/4'], ['x, 0, 1/4', '-x, 0, 1/4', '-x, 0, 3/4', 'x, 0, 3/4', 'x+1/2, 1/2, 1/4', '-x+1/2, 1/2, 1/4', '-x+1/2, 1/2, 3/4', 'x+1/2, 1/2, 3/4'], ['1/4, 3/4, 0', '3/4, 3/4, 1/2', '3/4, 5/4, 0', '5/4, 5/4, 1/2'], ['1/4, 1/4, 0', '3/4, 1/4, 1/2', '3/4, 3/4, 0', '5/4, 3/4, 1/2'], ['0, 1/2, 0', '0, 1/2, 1/2', '1/2, 1, 0', '1/2, 1, 1/2'], ['0, 0, 0', '0, 0, 1/2', '1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 1/2, 1/4', '0, 1/2, 3/4', '1/2, 1, 1/4', '1/2, 1, 3/4'], ['0, 0, 1/4', '0, 0, 3/4', '1/2, 1/2, 1/4', '1/2, 1/2, 3/4']]" +67,"[['x, y, z', '-x, -y+1/2, z', '-x, y+1/2, -z', 'x, -y, -z', '-x, -y, -z', 'x, y+1/2, -z', 'x, -y+1/2, z', '-x, y, z', 'x+1/2, y+1/2, z', '-x+1/2, -y+1, z', '-x+1/2, y+1, -z', 'x+1/2, -y+1/2, -z', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1, -z', 'x+1/2, -y+1, z', '-x+1/2, y+1/2, z'], ['x, 1/4, z', '-x, 1/4, z', '-x, 3/4, -z', 'x, 3/4, -z', 'x+1/2, 3/4, z', '-x+1/2, 3/4, z', '-x+1/2, 5/4, -z', 'x+1/2, 5/4, -z'], ['0, y, z', '0, -y+1/2, z', '0, y+1/2, -z', '0, -y, -z', '1/2, y+1/2, z', '1/2, -y+1, z', '1/2, y+1, -z', '1/2, -y+1/2, -z'], ['1/4, 0, z', '3/4, 1/2, -z', '3/4, 0, -z', '1/4, 1/2, z', '3/4, 1/2, z', '5/4, 1, -z', '5/4, 1/2, -z', '3/4, 1, z'], ['1/4, y, 1/2', '3/4, -y+1/2, 1/2', '3/4, -y, 1/2', '1/4, y+1/2, 1/2', '3/4, y+1/2, 1/2', '5/4, -y+1, 1/2', '5/4, -y+1/2, 1/2', '3/4, y+1, 1/2'], ['1/4, y, 0', '3/4, -y+1/2, 0', '3/4, -y, 0', '1/4, y+1/2, 0', '3/4, y+1/2, 0', '5/4, -y+1, 0', '5/4, -y+1/2, 0', '3/4, y+1, 0'], ['x, 0, 1/2', '-x, 1/2, 1/2', '-x, 0, 1/2', 'x, 1/2, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1, 1/2', '-x+1/2, 1/2, 1/2', 'x+1/2, 1, 1/2'], ['x, 0, 0', '-x, 1/2, 0', '-x, 0, 0', 'x, 1/2, 0', 'x+1/2, 1/2, 0', '-x+1/2, 1, 0', '-x+1/2, 1/2, 0', 'x+1/2, 1, 0'], ['0, 1/4, z', '0, 3/4, -z', '1/2, 3/4, z', '1/2, 5/4, -z'], ['1/4, 1/4, 1/2', '3/4, 1/4, 1/2', '3/4, 3/4, 1/2', '5/4, 3/4, 1/2'], ['1/4, 1/4, 0', '3/4, 1/4, 0', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['0, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2', '1/2, 1, 1/2'], ['0, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '1/2, 1, 0'], ['1/4, 0, 1/2', '3/4, 0, 1/2', '3/4, 1/2, 1/2', '5/4, 1/2, 1/2'], ['1/4, 0, 0', '3/4, 0, 0', '3/4, 1/2, 0', '5/4, 1/2, 0']]" +68,"[['x, y, z', '-x+1/2, -y, z', '-x, y, -z+1/2', 'x+1/2, -y, -z+1/2', '-x, -y, -z', 'x+1/2, y, -z', 'x, -y, z+1/2', '-x+1/2, y, z+1/2', 'x+1/2, y+1/2, z', '-x+1, -y+1/2, z', '-x+1/2, y+1/2, -z+1/2', 'x+1, -y+1/2, -z+1/2', '-x+1/2, -y+1/2, -z', 'x+1, y+1/2, -z', 'x+1/2, -y+1/2, z+1/2', '-x+1, y+1/2, z+1/2'], ['1/4, 0, z', '3/4, 0, -z+1/2', '3/4, 0, -z', '1/4, 0, z+1/2', '3/4, 1/2, z', '5/4, 1/2, -z+1/2', '5/4, 1/2, -z', '3/4, 1/2, z+1/2'], ['0, 1/4, z', '0, 1/4, -z+1/2', '0, 3/4, -z', '0, 3/4, z+1/2', '1/2, 3/4, z', '1/2, 3/4, -z+1/2', '1/2, 5/4, -z', '1/2, 5/4, z+1/2'], ['0, y, 1/4', '1/2, -y, 1/4', '0, -y, 3/4', '1/2, y, 3/4', '1/2, y+1/2, 1/4', '1, -y+1/2, 1/4', '1/2, -y+1/2, 3/4', '1, y+1/2, 3/4'], ['x, 1/4, 1/4', '-x+1/2, 3/4, 1/4', '-x, 3/4, 3/4', 'x+1/2, 1/4, 3/4', 'x+1/2, 3/4, 1/4', '-x+1, 5/4, 1/4', '-x+1/2, 5/4, 3/4', 'x+1, 3/4, 3/4'], ['0, 0, 0', '1/2, 0, 0', '0, 0, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '1, 1/2, 0', '1/2, 1/2, 1/2', '1, 1/2, 1/2'], ['1/4, 3/4, 0', '1/4, 1/4, 0', '3/4, 3/4, 1/2', '3/4, 1/4, 1/2', '3/4, 5/4, 0', '3/4, 3/4, 0', '5/4, 5/4, 1/2', '5/4, 3/4, 1/2'], ['0, 1/4, 3/4', '0, 3/4, 1/4', '1/2, 3/4, 3/4', '1/2, 5/4, 1/4'], ['0, 1/4, 1/4', '0, 3/4, 3/4', '1/2, 3/4, 1/4', '1/2, 5/4, 3/4']]" +69,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', '-x, -y+1/2, -z+1/2', 'x, y+1/2, -z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', '-x+1/2, -y, -z+1/2', 'x+1/2, y, -z+1/2', 'x+1/2, -y, z+1/2', '-x+1/2, y, z+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z'], ['x, y, 0', '-x, -y, 0', '-x, y, 0', 'x, -y, 0', 'x, y+1/2, 1/2', '-x, -y+1/2, 1/2', '-x, y+1/2, 1/2', 'x, -y+1/2, 1/2', 'x+1/2, y, 1/2', '-x+1/2, -y, 1/2', '-x+1/2, y, 1/2', 'x+1/2, -y, 1/2', 'x+1/2, y+1/2, 0', '-x+1/2, -y+1/2, 0', '-x+1/2, y+1/2, 0', 'x+1/2, -y+1/2, 0'], ['x, 0, z', '-x, 0, z', '-x, 0, -z', 'x, 0, -z', 'x, 1/2, z+1/2', '-x, 1/2, z+1/2', '-x, 1/2, -z+1/2', 'x, 1/2, -z+1/2', 'x+1/2, 0, z+1/2', '-x+1/2, 0, z+1/2', '-x+1/2, 0, -z+1/2', 'x+1/2, 0, -z+1/2', 'x+1/2, 1/2, z', '-x+1/2, 1/2, z', '-x+1/2, 1/2, -z', 'x+1/2, 1/2, -z'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', '0, y+1/2, z+1/2', '0, -y+1/2, z+1/2', '0, y+1/2, -z+1/2', '0, -y+1/2, -z+1/2', '1/2, y, z+1/2', '1/2, -y, z+1/2', '1/2, y, -z+1/2', '1/2, -y, -z+1/2', '1/2, y+1/2, z', '1/2, -y+1/2, z', '1/2, y+1/2, -z', '1/2, -y+1/2, -z'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '-x, 3/4, 3/4', 'x, 1/4, 3/4', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '-x, 5/4, 5/4', 'x, 3/4, 5/4', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '-x+1/2, 3/4, 5/4', 'x+1/2, 1/4, 5/4', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '-x+1/2, 5/4, 3/4', 'x+1/2, 3/4, 3/4'], ['1/4, y, 1/4', '3/4, -y, 1/4', '3/4, -y, 3/4', '1/4, y, 3/4', '1/4, y+1/2, 3/4', '3/4, -y+1/2, 3/4', '3/4, -y+1/2, 5/4', '1/4, y+1/2, 5/4', '3/4, y, 3/4', '5/4, -y, 3/4', '5/4, -y, 5/4', '3/4, y, 5/4', '3/4, y+1/2, 1/4', '5/4, -y+1/2, 1/4', '5/4, -y+1/2, 3/4', '3/4, y+1/2, 3/4'], ['1/4, 1/4, z', '3/4, 1/4, -z', '3/4, 3/4, -z', '1/4, 3/4, z', '1/4, 3/4, z+1/2', '3/4, 3/4, -z+1/2', '3/4, 5/4, -z+1/2', '1/4, 5/4, z+1/2', '3/4, 1/4, z+1/2', '5/4, 1/4, -z+1/2', '5/4, 3/4, -z+1/2', '3/4, 3/4, z+1/2', '3/4, 3/4, z', '5/4, 3/4, -z', '5/4, 5/4, -z', '3/4, 5/4, z'], ['0, 0, z', '0, 0, -z', '0, 1/2, z+1/2', '0, 1/2, -z+1/2', '1/2, 0, z+1/2', '1/2, 0, -z+1/2', '1/2, 1/2, z', '1/2, 1/2, -z'], ['0, y, 0', '0, -y, 0', '0, y+1/2, 1/2', '0, -y+1/2, 1/2', '1/2, y, 1/2', '1/2, -y, 1/2', '1/2, y+1/2, 0', '1/2, -y+1/2, 0'], ['x, 0, 0', '-x, 0, 0', 'x, 1/2, 1/2', '-x, 1/2, 1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4', '1/4, 3/4, 3/4', '3/4, 5/4, 5/4', '3/4, 1/4, 3/4', '5/4, 3/4, 5/4', '3/4, 3/4, 1/4', '5/4, 5/4, 3/4'], ['1/4, 1/4, 0', '3/4, 1/4, 0', '1/4, 3/4, 1/2', '3/4, 3/4, 1/2', '3/4, 1/4, 1/2', '5/4, 1/4, 1/2', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['1/4, 0, 1/4', '3/4, 0, 1/4', '1/4, 1/2, 3/4', '3/4, 1/2, 3/4', '3/4, 0, 3/4', '5/4, 0, 3/4', '3/4, 1/2, 1/4', '5/4, 1/2, 1/4'], ['0, 1/4, 1/4', '0, 3/4, 1/4', '0, 3/4, 3/4', '0, 5/4, 3/4', '1/2, 1/4, 3/4', '1/2, 3/4, 3/4', '1/2, 3/4, 1/4', '1/2, 5/4, 1/4'], ['0, 0, 1/2', '0, 1/2, 1', '1/2, 0, 1', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +70,"[['x, y, z', '-x+3/4, -y+3/4, z', '-x+3/4, y, -z+3/4', 'x, -y+3/4, -z+3/4', '-x, -y, -z', 'x+1/4, y+1/4, -z', 'x+1/4, -y, z+1/4', '-x, y+1/4, z+1/4', 'x, y+1/2, z+1/2', '-x+3/4, -y+5/4, z+1/2', '-x+3/4, y+1/2, -z+5/4', 'x, -y+5/4, -z+5/4', '-x, -y+1/2, -z+1/2', 'x+1/4, y+3/4, -z+1/2', 'x+1/4, -y+1/2, z+3/4', '-x, y+3/4, z+3/4', 'x+1/2, y, z+1/2', '-x+5/4, -y+3/4, z+1/2', '-x+5/4, y, -z+5/4', 'x+1/2, -y+3/4, -z+5/4', '-x+1/2, -y, -z+1/2', 'x+3/4, y+1/4, -z+1/2', 'x+3/4, -y, z+3/4', '-x+1/2, y+1/4, z+3/4', 'x+1/2, y+1/2, z', '-x+5/4, -y+5/4, z', '-x+5/4, y+1/2, -z+3/4', 'x+1/2, -y+5/4, -z+3/4', '-x+1/2, -y+1/2, -z', 'x+3/4, y+3/4, -z', 'x+3/4, -y+1/2, z+1/4', '-x+1/2, y+3/4, z+1/4'], ['1/8, 1/8, z', '5/8, 1/8, -z+3/4', '7/8, 7/8, -z', '3/8, 7/8, z+1/4', '1/8, 5/8, z+1/2', '5/8, 5/8, -z+5/4', '7/8, 11/8, -z+1/2', '3/8, 11/8, z+3/4', '5/8, 1/8, z+1/2', '9/8, 1/8, -z+5/4', '11/8, 7/8, -z+1/2', '7/8, 7/8, z+3/4', '5/8, 5/8, z', '9/8, 5/8, -z+3/4', '11/8, 11/8, -z', '7/8, 11/8, z+1/4'], ['1/8, y, 1/8', '5/8, -y+3/4, 1/8', '7/8, -y, 7/8', '3/8, y+1/4, 7/8', '1/8, y+1/2, 5/8', '5/8, -y+5/4, 5/8', '7/8, -y+1/2, 11/8', '3/8, y+3/4, 11/8', '5/8, y, 5/8', '9/8, -y+3/4, 5/8', '11/8, -y, 11/8', '7/8, y+1/4, 11/8', '5/8, y+1/2, 1/8', '9/8, -y+5/4, 1/8', '11/8, -y+1/2, 7/8', '7/8, y+3/4, 7/8'], ['x, 1/8, 1/8', '-x+3/4, 5/8, 1/8', '-x, 7/8, 7/8', 'x+1/4, 3/8, 7/8', 'x, 5/8, 5/8', '-x+3/4, 9/8, 5/8', '-x, 11/8, 11/8', 'x+1/4, 7/8, 11/8', 'x+1/2, 1/8, 5/8', '-x+5/4, 5/8, 5/8', '-x+1/2, 7/8, 11/8', 'x+3/4, 3/8, 11/8', 'x+1/2, 5/8, 1/8', '-x+5/4, 9/8, 1/8', '-x+1/2, 11/8, 7/8', 'x+3/4, 7/8, 7/8'], ['1/2, 1/2, 1/2', '1/4, 1/4, 1/2', '1/4, 1/2, 1/4', '1/2, 1/4, 1/4', '1/2, 1, 1', '1/4, 3/4, 1', '1/4, 1, 3/4', '1/2, 3/4, 3/4', '1, 1/2, 1', '3/4, 1/4, 1', '3/4, 1/2, 3/4', '1, 1/4, 3/4', '1, 1, 1/2', '3/4, 3/4, 1/2', '3/4, 1, 1/4', '1, 3/4, 1/4'], ['0, 0, 0', '3/4, 3/4, 0', '3/4, 0, 3/4', '0, 3/4, 3/4', '0, 1/2, 1/2', '3/4, 5/4, 1/2', '3/4, 1/2, 5/4', '0, 5/4, 5/4', '1/2, 0, 1/2', '5/4, 3/4, 1/2', '5/4, 0, 5/4', '1/2, 3/4, 5/4', '1/2, 1/2, 0', '5/4, 5/4, 0', '5/4, 1/2, 3/4', '1/2, 5/4, 3/4'], ['1/8, 1/8, 5/8', '7/8, 7/8, 3/8', '1/8, 5/8, 9/8', '7/8, 11/8, 7/8', '5/8, 1/8, 9/8', '11/8, 7/8, 7/8', '5/8, 5/8, 5/8', '11/8, 11/8, 3/8'], ['1/8, 1/8, 1/8', '7/8, 7/8, 7/8', '1/8, 5/8, 5/8', '7/8, 11/8, 11/8', '5/8, 1/8, 5/8', '11/8, 7/8, 11/8', '5/8, 5/8, 1/8', '11/8, 11/8, 7/8']]" +71,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['x, y, 0', '-x, -y, 0', '-x, y, 0', 'x, -y, 0', 'x+1/2, y+1/2, 1/2', '-x+1/2, -y+1/2, 1/2', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2'], ['x, 0, z', '-x, 0, z', '-x, 0, -z', 'x, 0, -z', 'x+1/2, 1/2, z+1/2', '-x+1/2, 1/2, z+1/2', '-x+1/2, 1/2, -z+1/2', 'x+1/2, 1/2, -z+1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', '1/2, y+1/2, z+1/2', '1/2, -y+1/2, z+1/2', '1/2, y+1/2, -z+1/2', '1/2, -y+1/2, -z+1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '1/4, 3/4, 3/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 5/4', '3/4, 5/4, 5/4'], ['1/2, 0, z', '1/2, 0, -z', '1, 1/2, z+1/2', '1, 1/2, -z+1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, y, 1/2', '0, -y, 1/2', '1/2, y+1/2, 1', '1/2, -y+1/2, 1'], ['0, y, 0', '0, -y, 0', '1/2, y+1/2, 1/2', '1/2, -y+1/2, 1/2'], ['x, 1/2, 0', '-x, 1/2, 0', 'x+1/2, 1, 1/2', '-x+1/2, 1, 1/2'], ['x, 0, 0', '-x, 0, 0', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2'], ['1/2, 0, 1/2', '1, 1/2, 1'], ['1/2, 1/2, 0', '1, 1, 1/2'], ['0, 1/2, 1/2', '1/2, 1, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +72,"[['x, y, z', '-x, -y, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', '-x, -y, -z', 'x, y, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1, y+1, -z+1/2', 'x+1, -y+1, -z+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'x+1, -y+1, z+1/2', '-x+1, y+1, z+1/2'], ['x, y, 0', '-x, -y, 0', '-x+1/2, y+1/2, 0', 'x+1/2, -y+1/2, 0', 'x+1/2, y+1/2, 1/2', '-x+1/2, -y+1/2, 1/2', '-x+1, y+1, 1/2', 'x+1, -y+1, 1/2'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, -z', '1/2, 0, z', '1/2, 1, z+1/2', '1, 1/2, -z+1/2', '1/2, 1, -z+1/2', '1, 1/2, z+1/2'], ['0, 0, z', '1/2, 1/2, -z', '0, 0, -z', '1/2, 1/2, z', '1/2, 1/2, z+1/2', '1, 1, -z+1/2', '1/2, 1/2, -z+1/2', '1, 1, z+1/2'], ['0, y, 1/4', '0, -y, 1/4', '0, -y, 3/4', '0, y, 3/4', '1/2, y+1/2, 3/4', '1/2, -y+1/2, 3/4', '1/2, -y+1/2, 5/4', '1/2, y+1/2, 5/4'], ['x, 0, 1/4', '-x, 0, 1/4', '-x, 0, 3/4', 'x, 0, 3/4', 'x+1/2, 1/2, 3/4', '-x+1/2, 1/2, 3/4', '-x+1/2, 1/2, 5/4', 'x+1/2, 1/2, 5/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '3/4, 5/4, 5/4', '5/4, 3/4, 5/4'], ['1/2, 0, 0', '0, 1/2, 0', '1, 1/2, 1/2', '1/2, 1, 1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 1/2, 1/2', '1, 1, 1/2'], ['1/2, 0, 1/4', '1/2, 0, 3/4', '1, 1/2, 3/4', '1, 1/2, 5/4'], ['0, 0, 1/4', '0, 0, 3/4', '1/2, 1/2, 3/4', '1/2, 1/2, 5/4']]" +73,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x, -y+1/2, z+1/2', '-x+1/2, y+1/2, z', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1, y+1/2, -z+1', 'x+1/2, -y+1, z+1', '-x+1, y+1, z+1/2'], ['0, 1/4, z', '0, 3/4, -z+1/2', '0, 3/4, -z', '0, 1/4, z+1/2', '1/2, 3/4, z+1/2', '1/2, 5/4, -z+1', '1/2, 5/4, -z+1/2', '1/2, 3/4, z+1'], ['1/4, y, 0', '1/4, -y, 1/2', '3/4, -y, 0', '3/4, y, 1/2', '3/4, y+1/2, 1/2', '3/4, -y+1/2, 1', '5/4, -y+1/2, 1/2', '5/4, y+1/2, 1'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '-x, 0, 3/4', 'x+1/2, 0, 1/4', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '-x+1/2, 1/2, 5/4', 'x+1, 1/2, 3/4'], ['1/4, 1/4, 1/4', '1/4, 3/4, 3/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '3/4, 3/4, 3/4', '3/4, 5/4, 5/4', '5/4, 5/4, 3/4', '5/4, 3/4, 5/4'], ['0, 0, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 0', '1/2, 1/2, 1/2', '1, 1/2, 1', '1/2, 1, 1', '1, 1, 1/2']]" +74,"[['x, y, z', '-x, -y+1/2, z', '-x, y+1/2, -z', 'x, -y, -z', '-x, -y, -z', 'x, y+1/2, -z', 'x, -y+1/2, z', '-x, y, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1, z+1/2', '-x+1/2, y+1, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1, -z+1/2', 'x+1/2, -y+1, z+1/2', '-x+1/2, y+1/2, z+1/2'], ['x, 1/4, z', '-x, 1/4, z', '-x, 3/4, -z', 'x, 3/4, -z', 'x+1/2, 3/4, z+1/2', '-x+1/2, 3/4, z+1/2', '-x+1/2, 5/4, -z+1/2', 'x+1/2, 5/4, -z+1/2'], ['0, y, z', '0, -y+1/2, z', '0, y+1/2, -z', '0, -y, -z', '1/2, y+1/2, z+1/2', '1/2, -y+1, z+1/2', '1/2, y+1, -z+1/2', '1/2, -y+1/2, -z+1/2'], ['1/4, y, 1/4', '3/4, -y+1/2, 1/4', '3/4, -y, 3/4', '1/4, y+1/2, 3/4', '3/4, y+1/2, 3/4', '5/4, -y+1, 3/4', '5/4, -y+1/2, 5/4', '3/4, y+1, 5/4'], ['x, 0, 0', '-x, 1/2, 0', '-x, 0, 0', 'x, 1/2, 0', 'x+1/2, 1/2, 1/2', '-x+1/2, 1, 1/2', '-x+1/2, 1/2, 1/2', 'x+1/2, 1, 1/2'], ['0, 1/4, z', '0, 3/4, -z', '1/2, 3/4, z+1/2', '1/2, 5/4, -z+1/2'], ['1/4, 1/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 5/4', '5/4, 3/4, 5/4'], ['1/4, 1/4, 1/4', '3/4, 1/4, 1/4', '3/4, 3/4, 3/4', '5/4, 3/4, 3/4'], ['0, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1', '1/2, 1, 1'], ['0, 0, 0', '0, 1/2, 0', '1/2, 1/2, 1/2', '1/2, 1, 1/2']]" +75,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z'], ['0, 1/2, z', '1/2, 0, z'], ['1/2, 1/2, z'], ['0, 0, z']]" +76,"[['x, y, z', '-x, -y, z+1/2', '-y, x, z+1/4', 'y, -x, z+3/4']]" +77,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2'], ['0, 1/2, z', '1/2, 0, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +78,"[['x, y, z', '-x, -y, z+1/2', '-y, x, z+3/4', 'y, -x, z+1/4']]" +79,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2'], ['0, 1/2, z', '1/2, 0, z', '1/2, 1, z+1/2', '1, 1/2, z+1/2'], ['0, 0, z', '1/2, 1/2, z+1/2']]" +80,"[['x, y, z', '-x+1/2, -y+1/2, z+1/2', '-y, x+1/2, z+1/4', 'y+1/2, -x, z+3/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1, z+1', '-y+1/2, x+1, z+3/4', 'y+1, -x+1/2, z+5/4'], ['0, 0, z', '0, 1/2, z+1/4', '1/2, 1/2, z+1/2', '1/2, 1, z+3/4']]" +81,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z'], ['0, 1/2, z', '1/2, 0, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['1/2, 1/2, 1/2'], ['1/2, 1/2, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +82,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2'], ['0, 1/2, z', '1/2, 0, -z', '1/2, 1, z+1/2', '1, 1/2, -z+1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 3/4', '1/2, 1, 5/4'], ['0, 1/2, 1/4', '1/2, 1, 3/4'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +83,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z'], ['x, y, 1/2', '-x, -y, 1/2', '-y, x, 1/2', 'y, -x, 1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z', '1/2, 0, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['0, 1/2, 1/2', '1/2, 0, 1/2'], ['0, 1/2, 0', '1/2, 0, 0'], ['1/2, 1/2, 1/2'], ['1/2, 1/2, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +84,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', '-x, -y, -z', 'x, y, -z', 'y, -x, -z+1/2', '-y, x, -z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 1/2', 'y, -x, 1/2'], ['0, 1/2, z', '1/2, 0, z+1/2', '0, 1/2, -z', '1/2, 0, -z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z', '1/2, 1/2, -z+1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z', '0, 0, -z+1/2'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 1/2, 1/2', '1/2, 0, 0'], ['0, 1/2, 0', '1/2, 0, 1/2'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2']]" +85,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z', 'y, -x+1/2, z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z', '-y, x+1/2, -z'], ['1/4, 3/4, z', '3/4, 1/4, z', '3/4, 1/4, -z', '1/4, 3/4, -z'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 0', '0, 1/2, 0'], ['1/4, 1/4, z', '3/4, 3/4, -z'], ['1/4, 3/4, 1/2', '3/4, 1/4, 1/2'], ['1/4, 3/4, 0', '3/4, 1/4, 0']]" +86,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y, x+1/2, z+1/2', 'y+1/2, -x, z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y, -x+1/2, -z+1/2', '-y+1/2, x, -z+1/2'], ['1/4, 1/4, z', '3/4, 3/4, z+1/2', '3/4, 3/4, -z', '1/4, 1/4, -z+1/2'], ['3/4, 1/4, z', '3/4, 1/4, z+1/2', '1/4, 3/4, -z', '1/4, 3/4, -z+1/2'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '0, 1/2, 0', '1/2, 0, 0'], ['0, 0, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2'], ['1/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4']]" +87,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', 'x+1/2, y+1/2, 1/2', '-x+1/2, -y+1/2, 1/2', '-y+1/2, x+1/2, 1/2', 'y+1/2, -x+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z', '1/2, 0, -z', '1/2, 1, z+1/2', '1, 1/2, z+1/2', '1/2, 1, -z+1/2', '1, 1/2, -z+1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 1/4', '1/4, 3/4, 1/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 3/4', '3/4, 5/4, 3/4'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 1/4', '1/2, 0, 1/4', '1/2, 1, 3/4', '1, 1/2, 3/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 1, 1/2', '1, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +88,"[['x, y, z', '-x+1/2, -y, z+1/2', '-y+3/4, x+1/4, z+1/4', 'y+3/4, -x+3/4, z+3/4', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'y+1/4, -x+3/4, -z+3/4', '-y+1/4, x+1/4, -z+1/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-y+5/4, x+3/4, z+3/4', 'y+5/4, -x+5/4, z+5/4', '-x+1/2, -y+1/2, -z+1/2', 'x+1, y+1/2, -z+1', 'y+3/4, -x+5/4, -z+5/4', '-y+3/4, x+3/4, -z+3/4'], ['0, 1/4, z', '1/2, 1/4, z+1/4', '0, 3/4, -z', '1/2, 3/4, -z+3/4', '1/2, 3/4, z+1/2', '1, 3/4, z+3/4', '1/2, 5/4, -z+1/2', '1, 5/4, -z+5/4'], ['0, 0, 1/2', '1/2, 0, 0', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4', '1/2, 1/2, 1', '1, 1/2, 1/2', '5/4, 3/4, 5/4', '5/4, 5/4, 3/4'], ['0, 0, 0', '1/2, 0, 1/2', '3/4, 1/4, 1/4', '3/4, 3/4, 3/4', '1/2, 1/2, 1/2', '1, 1/2, 1', '5/4, 3/4, 3/4', '5/4, 5/4, 5/4'], ['0, 1/4, 5/8', '1/2, 1/4, 7/8', '1/2, 3/4, 9/8', '1, 3/4, 11/8'], ['0, 1/4, 1/8', '1/2, 1/4, 3/8', '1/2, 3/4, 5/8', '1, 3/4, 7/8']]" +89,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, y, -z', 'x, -y, -z', 'y, x, -z', '-y, -x, -z'], ['x, 1/2, 0', '-x, 1/2, 0', '1/2, x, 0', '1/2, -x, 0'], ['x, 0, 1/2', '-x, 0, 1/2', '0, x, 1/2', '0, -x, 1/2'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0'], ['x, x, 1/2', '-x, -x, 1/2', '-x, x, 1/2', 'x, -x, 1/2'], ['x, x, 0', '-x, -x, 0', '-x, x, 0', 'x, -x, 0'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z', '1/2, 0, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['1/2, 0, 1/2', '0, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0'], ['1/2, 1/2, 1/2'], ['1/2, 1/2, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +90,"[['x, y, z', '-x, -y, z', '-y+1/2, x+1/2, z', 'y+1/2, -x+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'y, x, -z', '-y, -x, -z'], ['x, x, 1/2', '-x, -x, 1/2', '-x+1/2, x+1/2, 1/2', 'x+1/2, -x+1/2, 1/2'], ['x, x, 0', '-x, -x, 0', '-x+1/2, x+1/2, 0', 'x+1/2, -x+1/2, 0'], ['0, 0, z', '1/2, 1/2, z', '1/2, 1/2, -z', '0, 0, -z'], ['0, 1/2, z', '1/2, 0, -z'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0']]" +91,"[['x, y, z', '-x, -y, z+1/2', '-y, x, z+1/4', 'y, -x, z+3/4', '-x, y, -z', 'x, -y, -z+1/2', 'y, x, -z+3/4', '-y, -x, -z+1/4'], ['x, x, 3/8', '-x, -x, 7/8', '-x, x, 5/8', 'x, -x, 1/8'], ['1/2, y, 0', '1/2, -y, 1/2', '-y, 1/2, 1/4', 'y, 1/2, 3/4'], ['0, y, 0', '0, -y, 1/2', '-y, 0, 1/4', 'y, 0, 3/4']]" +92,"[['x, y, z', '-x, -y, z+1/2', '-y+1/2, x+1/2, z+1/4', 'y+1/2, -x+1/2, z+3/4', '-x+1/2, y+1/2, -z+1/4', 'x+1/2, -y+1/2, -z+3/4', 'y, x, -z', '-y, -x, -z+1/2'], ['x, x, 0', '-x, -x, 1/2', '-x+1/2, x+1/2, 1/4', 'x+1/2, -x+1/2, 3/4']]" +93,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', '-x, y, -z', 'x, -y, -z', 'y, x, -z+1/2', '-y, -x, -z+1/2'], ['x, x, 3/4', '-x, -x, 3/4', '-x, x, 1/4', 'x, -x, 1/4'], ['x, x, 1/4', '-x, -x, 1/4', '-x, x, 3/4', 'x, -x, 3/4'], ['x, 1/2, 0', '-x, 1/2, 0', '1/2, x, 1/2', '1/2, -x, 1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '0, x, 0', '0, -x, 0'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 0', '1/2, -x, 0'], ['x, 0, 0', '-x, 0, 0', '0, x, 1/2', '0, -x, 1/2'], ['0, 1/2, z', '1/2, 0, z+1/2', '0, 1/2, -z', '1/2, 0, -z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z', '1/2, 1/2, -z+1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z', '0, 0, -z+1/2'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 1/2, 1/2', '1/2, 0, 0'], ['0, 1/2, 0', '1/2, 0, 1/2'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2']]" +94,"[['x, y, z', '-x, -y, z', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'y, x, -z', '-y, -x, -z'], ['x, x, 1/2', '-x, -x, 1/2', '-x+1/2, x+1/2, 0', 'x+1/2, -x+1/2, 0'], ['x, x, 0', '-x, -x, 0', '-x+1/2, x+1/2, 1/2', 'x+1/2, -x+1/2, 1/2'], ['0, 1/2, z', '0, 1/2, z+1/2', '1/2, 0, -z+1/2', '1/2, 0, -z'], ['0, 0, z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2', '0, 0, -z'], ['0, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +95,"[['x, y, z', '-x, -y, z+1/2', '-y, x, z+3/4', 'y, -x, z+1/4', '-x, y, -z', 'x, -y, -z+1/2', 'y, x, -z+1/4', '-y, -x, -z+3/4'], ['x, x, 5/8', '-x, -x, 1/8', '-x, x, 3/8', 'x, -x, 7/8'], ['1/2, y, 0', '1/2, -y, 1/2', '-y, 1/2, 3/4', 'y, 1/2, 1/4'], ['0, y, 0', '0, -y, 1/2', '-y, 0, 3/4', 'y, 0, 1/4']]" +96,"[['x, y, z', '-x, -y, z+1/2', '-y+1/2, x+1/2, z+3/4', 'y+1/2, -x+1/2, z+1/4', '-x+1/2, y+1/2, -z+3/4', 'x+1/2, -y+1/2, -z+1/4', 'y, x, -z', '-y, -x, -z+1/2'], ['x, x, 0', '-x, -x, 1/2', '-x+1/2, x+1/2, 3/4', 'x+1/2, -x+1/2, 1/4']]" +97,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, y, -z', 'x, -y, -z', 'y, x, -z', '-y, -x, -z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2'], ['x, x+1/2, 1/4', '-x, -x+1/2, 1/4', '-x+1/2, x, 1/4', 'x+1/2, -x, 1/4', 'x+1/2, x+1, 3/4', '-x+1/2, -x+1, 3/4', '-x+1, x+1/2, 3/4', 'x+1, -x+1/2, 3/4'], ['x, 0, 1/2', '-x, 0, 1/2', '0, x, 1/2', '0, -x, 1/2', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1', '1/2, x+1/2, 1', '1/2, -x+1/2, 1'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2'], ['x, x, 0', '-x, -x, 0', '-x, x, 0', 'x, -x, 0', 'x+1/2, x+1/2, 1/2', '-x+1/2, -x+1/2, 1/2', '-x+1/2, x+1/2, 1/2', 'x+1/2, -x+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z', '1/2, 0, -z', '1/2, 1, z+1/2', '1, 1/2, z+1/2', '1/2, 1, -z+1/2', '1, 1/2, -z+1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 1/4', '1/2, 0, 1/4', '1/2, 1, 3/4', '1, 1/2, 3/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 1, 1/2', '1, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +98,"[['x, y, z', '-x+1/2, -y+1/2, z+1/2', '-y, x+1/2, z+1/4', 'y+1/2, -x, z+3/4', '-x+1/2, y, -z+3/4', 'x, -y+1/2, -z+1/4', 'y+1/2, x+1/2, -z+1/2', '-y, -x, -z', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1, z+1', '-y+1/2, x+1, z+3/4', 'y+1, -x+1/2, z+5/4', '-x+1, y+1/2, -z+5/4', 'x+1/2, -y+1, -z+3/4', 'y+1, x+1, -z+1', '-y+1/2, -x+1/2, -z+1/2'], ['x, 1/4, 1/8', '-x+1/2, 1/4, 5/8', '3/4, x+1/2, 3/8', '3/4, -x, 7/8', 'x+1/2, 3/4, 5/8', '-x+1, 3/4, 9/8', '5/4, x+1, 7/8', '5/4, -x+1/2, 11/8'], ['x, -x, 0', '-x+1/2, x+1/2, 1/2', 'x, x+1/2, 1/4', '-x+1/2, -x, 3/4', 'x+1/2, -x+1/2, 1/2', '-x+1, x+1, 1', 'x+1/2, x+1, 3/4', '-x+1, -x+1/2, 5/4'], ['x, x, 0', '-x+1/2, -x+1/2, 1/2', '-x, x+1/2, 1/4', 'x+1/2, -x, 3/4', 'x+1/2, x+1/2, 1/2', '-x+1, -x+1, 1', '-x+1/2, x+1, 3/4', 'x+1, -x+1/2, 5/4'], ['0, 0, z', '0, 1/2, z+1/4', '1/2, 0, -z+3/4', '1/2, 1/2, -z+1/2', '1/2, 1/2, z+1/2', '1/2, 1, z+3/4', '1, 1/2, -z+5/4', '1, 1, -z+1'], ['0, 0, 1/2', '0, 1/2, 3/4', '1/2, 1/2, 1', '1/2, 1, 5/4'], ['0, 0, 0', '0, 1/2, 1/4', '1/2, 1/2, 1/2', '1/2, 1, 3/4']]" +99,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x, -y, z', '-x, y, z', '-y, -x, z', 'y, x, z'], ['x, 1/2, z', '-x, 1/2, z', '1/2, x, z', '1/2, -x, z'], ['x, 0, z', '-x, 0, z', '0, x, z', '0, -x, z'], ['x, x, z', '-x, -x, z', '-x, x, z', 'x, -x, z'], ['1/2, 0, z', '0, 1/2, z'], ['1/2, 1/2, z'], ['0, 0, z']]" +100,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-y+1/2, -x+1/2, z', 'y+1/2, x+1/2, z'], ['x, x+1/2, z', '-x, -x+1/2, z', '-x+1/2, x, z', 'x+1/2, -x, z'], ['1/2, 0, z', '0, 1/2, z'], ['0, 0, z', '1/2, 1/2, z']]" +101,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', 'x, -y, z+1/2', '-x, y, z+1/2', '-y, -x, z', 'y, x, z'], ['x, x, z', '-x, -x, z', '-x, x, z+1/2', 'x, -x, z+1/2'], ['0, 1/2, z', '1/2, 0, z+1/2', '0, 1/2, z+1/2', '1/2, 0, z'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +102,"[['x, y, z', '-x, -y, z', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-y, -x, z', 'y, x, z'], ['x, x, z', '-x, -x, z', '-x+1/2, x+1/2, z+1/2', 'x+1/2, -x+1/2, z+1/2'], ['0, 1/2, z', '0, 1/2, z+1/2', '1/2, 0, z+1/2', '1/2, 0, z'], ['0, 0, z', '1/2, 1/2, z+1/2']]" +103,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x, -y, z+1/2', '-x, y, z+1/2', '-y, -x, z+1/2', 'y, x, z+1/2'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, z+1/2', '1/2, 0, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +104,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['0, 1/2, z', '1/2, 0, z', '1/2, 0, z+1/2', '0, 1/2, z+1/2'], ['0, 0, z', '1/2, 1/2, z+1/2']]" +105,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', 'x, -y, z', '-x, y, z', '-y, -x, z+1/2', 'y, x, z+1/2'], ['x, 1/2, z', '-x, 1/2, z', '1/2, x, z+1/2', '1/2, -x, z+1/2'], ['x, 0, z', '-x, 0, z', '0, x, z+1/2', '0, -x, z+1/2'], ['0, 1/2, z', '1/2, 0, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +106,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['0, 1/2, z', '1/2, 0, z+1/2', '1/2, 0, z', '0, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2', '1/2, 1/2, z', '1/2, 1/2, z+1/2']]" +107,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x, -y, z', '-x, y, z', '-y, -x, z', 'y, x, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['x, 0, z', '-x, 0, z', '0, x, z', '0, -x, z', 'x+1/2, 1/2, z+1/2', '-x+1/2, 1/2, z+1/2', '1/2, x+1/2, z+1/2', '1/2, -x+1/2, z+1/2'], ['x, x, z', '-x, -x, z', '-x, x, z', 'x, -x, z', 'x+1/2, x+1/2, z+1/2', '-x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, z+1/2', 'x+1/2, -x+1/2, z+1/2'], ['0, 1/2, z', '1/2, 0, z', '1/2, 1, z+1/2', '1, 1/2, z+1/2'], ['0, 0, z', '1/2, 1/2, z+1/2']]" +108,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', 'x, -y, z+1/2', '-x, y, z+1/2', '-y, -x, z+1/2', 'y, x, z+1/2', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', 'x+1/2, -y+1/2, z+1', '-x+1/2, y+1/2, z+1', '-y+1/2, -x+1/2, z+1', 'y+1/2, x+1/2, z+1'], ['x, x+1/2, z', '-x, -x+1/2, z', '-x+1/2, x, z', 'x+1/2, -x, z', 'x+1/2, x+1, z+1/2', '-x+1/2, -x+1, z+1/2', '-x+1, x+1/2, z+1/2', 'x+1, -x+1/2, z+1/2'], ['1/2, 0, z', '0, 1/2, z', '1, 1/2, z+1/2', '1/2, 1, z+1/2'], ['0, 0, z', '0, 0, z+1/2', '1/2, 1/2, z+1/2', '1/2, 1/2, z+1']]" +109,"[['x, y, z', '-x+1/2, -y+1/2, z+1/2', '-y, x+1/2, z+1/4', 'y+1/2, -x, z+3/4', 'x, -y, z', '-x+1/2, y+1/2, z+1/2', '-y, -x+1/2, z+1/4', 'y+1/2, x, z+3/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1, z+1', '-y+1/2, x+1, z+3/4', 'y+1, -x+1/2, z+5/4', 'x+1/2, -y+1/2, z+1/2', '-x+1, y+1, z+1', '-y+1/2, -x+1, z+3/4', 'y+1, x+1/2, z+5/4'], ['0, y, z', '1/2, -y+1/2, z+1/2', '-y, 1/2, z+1/4', 'y+1/2, 0, z+3/4', '1/2, y+1/2, z+1/2', '1, -y+1, z+1', '-y+1/2, 1, z+3/4', 'y+1, 1/2, z+5/4'], ['0, 0, z', '0, 1/2, z+1/4', '1/2, 1/2, z+1/2', '1/2, 1, z+3/4']]" +110,"[['x, y, z', '-x+1/2, -y+1/2, z+1/2', '-y, x+1/2, z+1/4', 'y+1/2, -x, z+3/4', 'x, -y, z+1/2', '-x+1/2, y+1/2, z', '-y, -x+1/2, z+3/4', 'y+1/2, x, z+1/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1, z+1', '-y+1/2, x+1, z+3/4', 'y+1, -x+1/2, z+5/4', 'x+1/2, -y+1/2, z+1', '-x+1, y+1, z+1/2', '-y+1/2, -x+1, z+5/4', 'y+1, x+1/2, z+3/4'], ['0, 0, z', '0, 1/2, z+1/4', '0, 0, z+1/2', '0, 1/2, z+3/4', '1/2, 1/2, z+1/2', '1/2, 1, z+3/4', '1/2, 1/2, z+1', '1/2, 1, z+5/4']]" +111,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', '-x, y, -z', 'x, -y, -z', '-y, -x, z', 'y, x, z'], ['x, x, z', '-x, -x, z', 'x, -x, -z', '-x, x, -z'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, -z', '1/2, 0, z'], ['x, 1/2, 0', '-x, 1/2, 0', '1/2, -x, 0', '1/2, x, 0'], ['x, 0, 1/2', '-x, 0, 1/2', '0, -x, 1/2', '0, x, 1/2'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, -x, 1/2', '1/2, x, 1/2'], ['x, 0, 0', '-x, 0, 0', '0, -x, 0', '0, x, 0'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['1/2, 0, 1/2', '0, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0'], ['1/2, 1/2, 0'], ['0, 0, 1/2'], ['1/2, 1/2, 1/2'], ['0, 0, 0']]" +112,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', '-x, y, -z+1/2', 'x, -y, -z+1/2', '-y, -x, z+1/2', 'y, x, z+1/2'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, -z+1/2', '1/2, 0, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, -z', '1/2, 1/2, -z+1/2', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, -z', '0, 0, -z+1/2', '0, 0, z+1/2'], ['0, y, 1/4', '0, -y, 1/4', 'y, 0, 3/4', '-y, 0, 3/4'], ['x, 1/2, 1/4', '-x, 1/2, 1/4', '1/2, -x, 3/4', '1/2, x, 3/4'], ['1/2, y, 1/4', '1/2, -y, 1/4', 'y, 1/2, 3/4', '-y, 1/2, 3/4'], ['x, 0, 1/4', '-x, 0, 1/4', '0, -x, 3/4', '0, x, 3/4'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2'], ['0, 1/2, 1/4', '1/2, 0, 3/4'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['1/2, 0, 1/4', '0, 1/2, 3/4'], ['0, 0, 1/4', '0, 0, 3/4']]" +113,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', '-y+1/2, -x+1/2, z', 'y+1/2, x+1/2, z'], ['x, x+1/2, z', '-x, -x+1/2, z', 'x+1/2, -x, -z', '-x+1/2, x, -z'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, -z', '1/2, 1/2, z'], ['0, 1/2, z', '1/2, 0, -z'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0']]" +114,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['0, 1/2, z', '1/2, 0, -z', '1/2, 0, -z+1/2', '0, 1/2, z+1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, -z+1/2', '1/2, 1/2, z+1/2'], ['0, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +115,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x, -y, z', '-x, y, z', 'y, x, -z', '-y, -x, -z'], ['x, 1/2, z', '-x, 1/2, z', '1/2, -x, -z', '1/2, x, -z'], ['x, 0, z', '-x, 0, z', '0, -x, -z', '0, x, -z'], ['x, x, 1/2', '-x, -x, 1/2', 'x, -x, 1/2', '-x, x, 1/2'], ['x, x, 0', '-x, -x, 0', 'x, -x, 0', '-x, x, 0'], ['0, 1/2, z', '1/2, 0, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['0, 0, 1/2'], ['1/2, 1/2, 1/2'], ['1/2, 1/2, 0'], ['0, 0, 0']]" +116,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x, -y, z+1/2', '-x, y, z+1/2', 'y, x, -z+1/2', '-y, -x, -z+1/2'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, z+1/2', '1/2, 0, -z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 0, z', '0, 0, -z', '0, 0, z+1/2', '0, 0, -z+1/2'], ['x, x, 3/4', '-x, -x, 3/4', 'x, -x, 1/4', '-x, x, 1/4'], ['x, x, 1/4', '-x, -x, 1/4', 'x, -x, 3/4', '-x, x, 3/4'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 0, 1/4', '0, 0, 3/4']]" +117,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', 'y+1/2, x+1/2, -z', '-y+1/2, -x+1/2, -z'], ['x, x+1/2, 1/2', '-x, -x+1/2, 1/2', 'x+1/2, -x, 1/2', '-x+1/2, x, 1/2'], ['x, x+1/2, 0', '-x, -x+1/2, 0', 'x+1/2, -x, 0', '-x+1/2, x, 0'], ['0, 1/2, z', '1/2, 0, -z', '1/2, 0, z', '0, 1/2, -z'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 1/2, 1/2', '1/2, 0, 1/2'], ['0, 1/2, 0', '1/2, 0, 0'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0']]" +118,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2'], ['0, 1/2, z', '1/2, 0, -z', '1/2, 0, z+1/2', '0, 1/2, -z+1/2'], ['x, x+1/2, 1/4', '-x, -x+1/2, 1/4', 'x+1/2, -x, 3/4', '-x+1/2, x, 3/4'], ['x, -x+1/2, 1/4', '-x, x+1/2, 1/4', '-x+1/2, -x, 3/4', 'x+1/2, x, 3/4'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 3/4', '1/2, 0, 1/4'], ['0, 1/2, 1/4', '1/2, 0, 3/4'], ['0, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +119,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x, -y, z', '-x, y, z', 'y, x, -z', '-y, -x, -z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2'], ['x, 0, z', '-x, 0, z', '0, -x, -z', '0, x, -z', 'x+1/2, 1/2, z+1/2', '-x+1/2, 1/2, z+1/2', '1/2, -x+1/2, -z+1/2', '1/2, x+1/2, -z+1/2'], ['x, x+1/2, 1/4', '-x, -x+1/2, 1/4', 'x+1/2, -x, 3/4', '-x+1/2, x, 3/4', 'x+1/2, x+1, 3/4', '-x+1/2, -x+1, 3/4', 'x+1, -x+1/2, 5/4', '-x+1, x+1/2, 5/4'], ['x, x, 0', '-x, -x, 0', 'x, -x, 0', '-x, x, 0', 'x+1/2, x+1/2, 1/2', '-x+1/2, -x+1/2, 1/2', 'x+1/2, -x+1/2, 1/2', '-x+1/2, x+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, -z', '1/2, 1, z+1/2', '1, 1/2, -z+1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 3/4', '1/2, 1, 5/4'], ['0, 1/2, 1/4', '1/2, 1, 3/4'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +120,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', 'x, -y, z+1/2', '-x, y, z+1/2', 'y, x, -z+1/2', '-y, -x, -z+1/2', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1', '-x+1/2, y+1/2, z+1', 'y+1/2, x+1/2, -z+1', '-y+1/2, -x+1/2, -z+1'], ['x, x+1/2, 0', '-x, -x+1/2, 0', 'x+1/2, -x, 0', '-x+1/2, x, 0', 'x+1/2, x+1, 1/2', '-x+1/2, -x+1, 1/2', 'x+1, -x+1/2, 1/2', '-x+1, x+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, z+1/2', '1/2, 0, -z+1/2', '1/2, 1, z+1/2', '1, 1/2, -z+1/2', '1/2, 1, z+1', '1, 1/2, -z+1'], ['0, 0, z', '0, 0, -z', '0, 0, z+1/2', '0, 0, -z+1/2', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2', '1/2, 1/2, z+1', '1/2, 1/2, -z+1'], ['x, x, 1/4', '-x, -x, 1/4', 'x, -x, 3/4', '-x, x, 3/4', 'x+1/2, x+1/2, 3/4', '-x+1/2, -x+1/2, 3/4', 'x+1/2, -x+1/2, 5/4', '-x+1/2, x+1/2, 5/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 1, 1/2', '1, 1/2, 1/2'], ['0, 1/2, 1/4', '0, 1/2, 3/4', '1/2, 1, 3/4', '1/2, 1, 5/4'], ['0, 0, 0', '0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 1/2, 1'], ['0, 0, 1/4', '0, 0, 3/4', '1/2, 1/2, 3/4', '1/2, 1/2, 5/4']]" +121,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', '-x, y, -z', 'x, -y, -z', '-y, -x, z', 'y, x, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['x, x, z', '-x, -x, z', 'x, -x, -z', '-x, x, -z', 'x+1/2, x+1/2, z+1/2', '-x+1/2, -x+1/2, z+1/2', 'x+1/2, -x+1/2, -z+1/2', '-x+1/2, x+1/2, -z+1/2'], ['0, 1/2, z', '1/2, 0, -z', '0, 1/2, -z', '1/2, 0, z', '1/2, 1, z+1/2', '1, 1/2, -z+1/2', '1/2, 1, -z+1/2', '1, 1/2, z+1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '0, -x, 1/2', '0, x, 1/2', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1', '1/2, -x+1/2, 1', '1/2, x+1/2, 1'], ['x, 0, 0', '-x, 0, 0', '0, -x, 0', '0, x, 0', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, -x+1/2, 1/2', '1/2, x+1/2, 1/2'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 1/4', '0, 1/2, 3/4', '1/2, 1, 3/4', '1/2, 1, 5/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 1, 1/2', '1, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +122,"[['x, y, z', '-x, -y, z', 'y, -x, -z', '-y, x, -z', '-x+1/2, y, -z+3/4', 'x+1/2, -y, -z+3/4', '-y+1/2, -x, z+3/4', 'y+1/2, x, z+3/4', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', '-x+1, y+1/2, -z+5/4', 'x+1, -y+1/2, -z+5/4', '-y+1, -x+1/2, z+5/4', 'y+1, x+1/2, z+5/4'], ['x, 1/4, 1/8', '-x, 3/4, 1/8', '1/4, -x, 7/8', '3/4, x, 7/8', 'x+1/2, 3/4, 5/8', '-x+1/2, 5/4, 5/8', '3/4, -x+1/2, 11/8', '5/4, x+1/2, 11/8'], ['0, 0, z', '0, 0, -z', '1/2, 0, -z+3/4', '1/2, 0, z+3/4', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2', '1, 1/2, -z+5/4', '1, 1/2, z+5/4'], ['0, 0, 1/2', '1/2, 0, 1/4', '1/2, 1/2, 1', '1, 1/2, 3/4'], ['0, 0, 0', '1/2, 0, 3/4', '1/2, 1/2, 1/2', '1, 1/2, 5/4']]" +123,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, y, -z', 'x, -y, -z', 'y, x, -z', '-y, -x, -z', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x, -y, z', '-x, y, z', '-y, -x, z', 'y, x, z'], ['x, 1/2, z', '-x, 1/2, z', '1/2, x, z', '1/2, -x, z', '-x, 1/2, -z', 'x, 1/2, -z', '1/2, x, -z', '1/2, -x, -z'], ['x, 0, z', '-x, 0, z', '0, x, z', '0, -x, z', '-x, 0, -z', 'x, 0, -z', '0, x, -z', '0, -x, -z'], ['x, x, z', '-x, -x, z', '-x, x, z', 'x, -x, z', '-x, x, -z', 'x, -x, -z', 'x, x, -z', '-x, -x, -z'], ['x, y, 1/2', '-x, -y, 1/2', '-y, x, 1/2', 'y, -x, 1/2', '-x, y, 1/2', 'x, -y, 1/2', 'y, x, 1/2', '-y, -x, 1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', '-x, y, 0', 'x, -y, 0', 'y, x, 0', '-y, -x, 0'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2'], ['x, 1/2, 0', '-x, 1/2, 0', '1/2, x, 0', '1/2, -x, 0'], ['x, 0, 1/2', '-x, 0, 1/2', '0, x, 1/2', '0, -x, 1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0'], ['x, x, 1/2', '-x, -x, 1/2', '-x, x, 1/2', 'x, -x, 1/2'], ['x, x, 0', '-x, -x, 0', '-x, x, 0', 'x, -x, 0'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z', '1/2, 0, -z'], ['1/2, 1/2, z', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, -z'], ['0, 1/2, 0', '1/2, 0, 0'], ['0, 1/2, 1/2', '1/2, 0, 1/2'], ['1/2, 1/2, 1/2'], ['1/2, 1/2, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +124,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, y, -z+1/2', 'x, -y, -z+1/2', 'y, x, -z+1/2', '-y, -x, -z+1/2', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x, -y, z+1/2', '-x, y, z+1/2', '-y, -x, z+1/2', 'y, x, z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', '-x, y, 1/2', 'x, -y, 1/2', 'y, x, 1/2', '-y, -x, 1/2'], ['x, 1/2, 1/4', '-x, 1/2, 1/4', '1/2, x, 1/4', '1/2, -x, 1/4', '-x, 1/2, 3/4', 'x, 1/2, 3/4', '1/2, -x, 3/4', '1/2, x, 3/4'], ['x, 0, 1/4', '-x, 0, 1/4', '0, x, 1/4', '0, -x, 1/4', '-x, 0, 3/4', 'x, 0, 3/4', '0, -x, 3/4', '0, x, 3/4'], ['x, x, 1/4', '-x, -x, 1/4', '-x, x, 1/4', 'x, -x, 1/4', '-x, -x, 3/4', 'x, x, 3/4', 'x, -x, 3/4', '-x, x, 3/4'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z+1/2', '1/2, 0, -z+1/2', '0, 1/2, -z', '1/2, 0, -z', '0, 1/2, z+1/2', '1/2, 0, z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, -z+1/2', '1/2, 1/2, -z', '1/2, 1/2, z+1/2'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2'], ['0, 1/2, 1/4', '1/2, 0, 1/4', '0, 1/2, 3/4', '1/2, 0, 3/4'], ['0, 1/2, 0', '1/2, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 0, 0', '0, 0, 1/2'], ['0, 0, 1/4', '0, 0, 3/4']]" +125,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z', 'y, -x+1/2, z', '-x+1/2, y, -z', 'x, -y+1/2, -z', 'y, x, -z', '-y+1/2, -x+1/2, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z', '-y, x+1/2, -z', 'x+1/2, -y, z', '-x, y+1/2, z', '-y, -x, z', 'y+1/2, x+1/2, z'], ['x, -x, z', '-x+1/2, x+1/2, z', 'x+1/2, x, z', '-x, -x+1/2, z', '-x+1/2, -x, -z', 'x, x+1/2, -z', '-x, x, -z', 'x+1/2, -x+1/2, -z'], ['x, 1/4, 1/2', '-x+1/2, 1/4, 1/2', '1/4, x, 1/2', '1/4, -x+1/2, 1/2', '-x, 3/4, 1/2', 'x+1/2, 3/4, 1/2', '3/4, -x, 1/2', '3/4, x+1/2, 1/2'], ['x, 1/4, 0', '-x+1/2, 1/4, 0', '1/4, x, 0', '1/4, -x+1/2, 0', '-x, 3/4, 0', 'x+1/2, 3/4, 0', '3/4, -x, 0', '3/4, x+1/2, 0'], ['x, x, 1/2', '-x+1/2, -x+1/2, 1/2', '-x+1/2, x, 1/2', 'x, -x+1/2, 1/2', '-x, -x, 1/2', 'x+1/2, x+1/2, 1/2', 'x+1/2, -x, 1/2', '-x, x+1/2, 1/2'], ['x, x, 0', '-x+1/2, -x+1/2, 0', '-x+1/2, x, 0', 'x, -x+1/2, 0', '-x, -x, 0', 'x+1/2, x+1/2, 0', 'x+1/2, -x, 0', '-x, x+1/2, 0'], ['3/4, 1/4, z', '1/4, 3/4, z', '3/4, 1/4, -z', '1/4, 3/4, -z'], ['1/4, 1/4, z', '1/4, 1/4, -z', '3/4, 3/4, -z', '3/4, 3/4, z'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 0', '0, 1/2, 0'], ['3/4, 1/4, 1/2', '1/4, 3/4, 1/2'], ['3/4, 1/4, 0', '1/4, 3/4, 0'], ['1/4, 1/4, 1/2', '3/4, 3/4, 1/2'], ['1/4, 1/4, 0', '3/4, 3/4, 0']]" +126,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z', 'y, -x+1/2, z', '-x+1/2, y, -z+1/2', 'x, -y+1/2, -z+1/2', 'y, x, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z', '-y, x+1/2, -z', 'x+1/2, -y, z+1/2', '-x, y+1/2, z+1/2', '-y, -x, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['x, 3/4, 1/4', '-x+1/2, 3/4, 1/4', '3/4, x, 1/4', '3/4, -x+1/2, 1/4', '-x, 1/4, 3/4', 'x+1/2, 1/4, 3/4', '1/4, -x, 3/4', '1/4, x+1/2, 3/4'], ['x, 1/4, 1/4', '-x+1/2, 1/4, 1/4', '1/4, x, 1/4', '1/4, -x+1/2, 1/4', '-x, 3/4, 3/4', 'x+1/2, 3/4, 3/4', '3/4, -x, 3/4', '3/4, x+1/2, 3/4'], ['x, x, 1/4', '-x+1/2, -x+1/2, 1/4', '-x+1/2, x, 1/4', 'x, -x+1/2, 1/4', '-x, -x, 3/4', 'x+1/2, x+1/2, 3/4', 'x+1/2, -x, 3/4', '-x, x+1/2, 3/4'], ['1/4, 3/4, z', '3/4, 1/4, z', '1/4, 3/4, -z+1/2', '3/4, 1/4, -z+1/2', '3/4, 1/4, -z', '1/4, 3/4, -z', '3/4, 1/4, z+1/2', '1/4, 3/4, z+1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 0', '0, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '0, 0, 1/2', '1/2, 1/2, 1/2'], ['1/4, 1/4, z', '1/4, 1/4, -z+1/2', '3/4, 3/4, -z', '3/4, 3/4, z+1/2'], ['1/4, 3/4, 0', '3/4, 1/4, 0', '1/4, 3/4, 1/2', '3/4, 1/4, 1/2'], ['1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 1/4, 1/4', '1/4, 3/4, 1/4'], ['1/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4']]" +127,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'y+1/2, x+1/2, -z', '-y+1/2, -x+1/2, -z', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-y+1/2, -x+1/2, z', 'y+1/2, x+1/2, z'], ['x, x+1/2, z', '-x, -x+1/2, z', '-x+1/2, x, z', 'x+1/2, -x, z', '-x+1/2, x, -z', 'x+1/2, -x, -z', 'x, x+1/2, -z', '-x, -x+1/2, -z'], ['x, y, 1/2', '-x, -y, 1/2', '-y, x, 1/2', 'y, -x, 1/2', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2', 'y+1/2, x+1/2, 1/2', '-y+1/2, -x+1/2, 1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', '-x+1/2, y+1/2, 0', 'x+1/2, -y+1/2, 0', 'y+1/2, x+1/2, 0', '-y+1/2, -x+1/2, 0'], ['x, x+1/2, 1/2', '-x, -x+1/2, 1/2', '-x+1/2, x, 1/2', 'x+1/2, -x, 1/2'], ['x, x+1/2, 0', '-x, -x+1/2, 0', '-x+1/2, x, 0', 'x+1/2, -x, 0'], ['0, 1/2, z', '1/2, 0, z', '1/2, 0, -z', '0, 1/2, -z'], ['0, 0, z', '1/2, 1/2, -z', '0, 0, -z', '1/2, 1/2, z'], ['0, 1/2, 0', '1/2, 0, 0'], ['0, 1/2, 1/2', '1/2, 0, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0']]" +128,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2', 'y+1/2, x+1/2, 1/2', '-y+1/2, -x+1/2, 1/2'], ['x, x+1/2, 1/4', '-x, -x+1/2, 1/4', '-x+1/2, x, 1/4', 'x+1/2, -x, 1/4', '-x, -x+1/2, 3/4', 'x, x+1/2, 3/4', 'x+1/2, -x, 3/4', '-x+1/2, x, 3/4'], ['0, 1/2, z', '1/2, 0, z', '1/2, 0, -z+1/2', '0, 1/2, -z+1/2', '0, 1/2, -z', '1/2, 0, -z', '1/2, 0, z+1/2', '0, 1/2, z+1/2'], ['0, 0, z', '1/2, 1/2, -z+1/2', '0, 0, -z', '1/2, 1/2, z+1/2'], ['0, 1/2, 1/4', '1/2, 0, 1/4', '0, 1/2, 3/4', '1/2, 0, 3/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +129,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z', 'y, -x+1/2, z', '-x, y+1/2, -z', 'x+1/2, -y, -z', 'y+1/2, x+1/2, -z', '-y, -x, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z', '-y, x+1/2, -z', 'x, -y+1/2, z', '-x+1/2, y, z', '-y+1/2, -x+1/2, z', 'y, x, z'], ['x, x, z', '-x+1/2, -x+1/2, z', '-x+1/2, x, z', 'x, -x+1/2, z', '-x, x+1/2, -z', 'x+1/2, -x, -z', 'x+1/2, x+1/2, -z', '-x, -x, -z'], ['1/4, y, z', '1/4, -y+1/2, z', '-y+1/2, 1/4, z', 'y, 1/4, z', '3/4, y+1/2, -z', '3/4, -y, -z', 'y+1/2, 3/4, -z', '-y, 3/4, -z'], ['x, -x, 1/2', '-x+1/2, x+1/2, 1/2', 'x+1/2, x, 1/2', '-x, -x+1/2, 1/2', '-x, x, 1/2', 'x+1/2, -x+1/2, 1/2', '-x+1/2, -x, 1/2', 'x, x+1/2, 1/2'], ['x, -x, 0', '-x+1/2, x+1/2, 0', 'x+1/2, x, 0', '-x, -x+1/2, 0', '-x, x, 0', 'x+1/2, -x+1/2, 0', '-x+1/2, -x, 0', 'x, x+1/2, 0'], ['3/4, 1/4, z', '1/4, 3/4, z', '1/4, 3/4, -z', '3/4, 1/4, -z'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 0', '0, 1/2, 0'], ['1/4, 1/4, z', '3/4, 3/4, -z'], ['3/4, 1/4, 1/2', '1/4, 3/4, 1/2'], ['3/4, 1/4, 0', '1/4, 3/4, 0']]" +130,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z', 'y, -x+1/2, z', '-x, y+1/2, -z+1/2', 'x+1/2, -y, -z+1/2', 'y+1/2, x+1/2, -z+1/2', '-y, -x, -z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z', '-y, x+1/2, -z', 'x, -y+1/2, z+1/2', '-x+1/2, y, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y, x, z+1/2'], ['x, -x, 1/4', '-x+1/2, x+1/2, 1/4', 'x+1/2, x, 1/4', '-x, -x+1/2, 1/4', '-x, x, 3/4', 'x+1/2, -x+1/2, 3/4', '-x+1/2, -x, 3/4', 'x, x+1/2, 3/4'], ['3/4, 1/4, z', '1/4, 3/4, z', '1/4, 3/4, -z+1/2', '3/4, 1/4, -z+1/2', '1/4, 3/4, -z', '3/4, 1/4, -z', '3/4, 1/4, z+1/2', '1/4, 3/4, z+1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 0', '0, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 1/2', '0, 0, 1/2'], ['1/4, 1/4, z', '3/4, 3/4, -z+1/2', '3/4, 3/4, -z', '1/4, 1/4, z+1/2'], ['3/4, 1/4, 0', '1/4, 3/4, 0', '1/4, 3/4, 1/2', '3/4, 1/4, 1/2'], ['3/4, 1/4, 1/4', '1/4, 3/4, 1/4', '1/4, 3/4, 3/4', '3/4, 1/4, 3/4']]" +131,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', '-x, y, -z', 'x, -y, -z', 'y, x, -z+1/2', '-y, -x, -z+1/2', '-x, -y, -z', 'x, y, -z', 'y, -x, -z+1/2', '-y, x, -z+1/2', 'x, -y, z', '-x, y, z', '-y, -x, z+1/2', 'y, x, z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 1/2', 'y, -x, 1/2', '-x, y, 0', 'x, -y, 0', 'y, x, 1/2', '-y, -x, 1/2'], ['1/2, y, z', '1/2, -y, z', '-y, 1/2, z+1/2', 'y, 1/2, z+1/2', '1/2, y, -z', '1/2, -y, -z', 'y, 1/2, -z+1/2', '-y, 1/2, -z+1/2'], ['0, y, z', '0, -y, z', '-y, 0, z+1/2', 'y, 0, z+1/2', '0, y, -z', '0, -y, -z', 'y, 0, -z+1/2', '-y, 0, -z+1/2'], ['x, x, 1/4', '-x, -x, 1/4', '-x, x, 3/4', 'x, -x, 3/4', '-x, -x, 3/4', 'x, x, 3/4', 'x, -x, 1/4', '-x, x, 1/4'], ['x, 1/2, 0', '-x, 1/2, 0', '1/2, x, 1/2', '1/2, -x, 1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '0, x, 0', '0, -x, 0'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 0', '1/2, -x, 0'], ['x, 0, 0', '-x, 0, 0', '0, x, 1/2', '0, -x, 1/2'], ['0, 1/2, z', '1/2, 0, z+1/2', '0, 1/2, -z', '1/2, 0, -z+1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z', '1/2, 1/2, -z+1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z', '0, 0, -z+1/2'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 1/2, 1/2', '1/2, 0, 0'], ['0, 1/2, 0', '1/2, 0, 1/2'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2']]" +132,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', '-x, y, -z+1/2', 'x, -y, -z+1/2', 'y, x, -z', '-y, -x, -z', '-x, -y, -z', 'x, y, -z', 'y, -x, -z+1/2', '-y, x, -z+1/2', 'x, -y, z+1/2', '-x, y, z+1/2', '-y, -x, z', 'y, x, z'], ['x, x, z', '-x, -x, z', '-x, x, z+1/2', 'x, -x, z+1/2', '-x, x, -z+1/2', 'x, -x, -z+1/2', 'x, x, -z', '-x, -x, -z'], ['x, y, 0', '-x, -y, 0', '-y, x, 1/2', 'y, -x, 1/2', '-x, y, 1/2', 'x, -y, 1/2', 'y, x, 0', '-y, -x, 0'], ['x, 1/2, 1/4', '-x, 1/2, 1/4', '1/2, x, 3/4', '1/2, -x, 3/4', '-x, 1/2, 3/4', 'x, 1/2, 3/4', '1/2, -x, 1/4', '1/2, x, 1/4'], ['x, 0, 1/4', '-x, 0, 1/4', '0, x, 3/4', '0, -x, 3/4', '-x, 0, 3/4', 'x, 0, 3/4', '0, -x, 1/4', '0, x, 1/4'], ['0, 1/2, z', '1/2, 0, z+1/2', '0, 1/2, -z+1/2', '1/2, 0, -z', '0, 1/2, -z', '1/2, 0, -z+1/2', '0, 1/2, z+1/2', '1/2, 0, z'], ['x, x, 1/2', '-x, -x, 1/2', '-x, x, 0', 'x, -x, 0'], ['x, x, 0', '-x, -x, 0', '-x, x, 1/2', 'x, -x, 1/2'], ['1/2, 1/2, z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2', '1/2, 1/2, -z'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z+1/2', '0, 0, -z'], ['0, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 0, 0'], ['0, 1/2, 1/4', '1/2, 0, 3/4', '0, 1/2, 3/4', '1/2, 0, 1/4'], ['1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['1/2, 1/2, 0', '1/2, 1/2, 1/2'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 0, 0', '0, 0, 1/2']]" +133,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z+1/2', 'y, -x+1/2, z+1/2', '-x+1/2, y, -z', 'x, -y+1/2, -z', 'y, x, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z+1/2', '-y, x+1/2, -z+1/2', 'x+1/2, -y, z', '-x, y+1/2, z', '-y, -x, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['x, x, 1/4', '-x+1/2, -x+1/2, 1/4', '-x+1/2, x, 3/4', 'x, -x+1/2, 3/4', '-x, -x, 3/4', 'x+1/2, x+1/2, 3/4', 'x+1/2, -x, 1/4', '-x, x+1/2, 1/4'], ['x, 1/4, 1/2', '-x+1/2, 1/4, 1/2', '1/4, x, 0', '1/4, -x+1/2, 0', '-x, 3/4, 1/2', 'x+1/2, 3/4, 1/2', '3/4, -x, 0', '3/4, x+1/2, 0'], ['x, 1/4, 0', '-x+1/2, 1/4, 0', '1/4, x, 1/2', '1/4, -x+1/2, 1/2', '-x, 3/4, 0', 'x+1/2, 3/4, 0', '3/4, -x, 1/2', '3/4, x+1/2, 1/2'], ['3/4, 1/4, z', '1/4, 3/4, z+1/2', '3/4, 1/4, -z', '1/4, 3/4, -z+1/2', '1/4, 3/4, -z', '3/4, 1/4, -z+1/2', '1/4, 3/4, z', '3/4, 1/4, z+1/2'], ['1/4, 1/4, z', '1/4, 1/4, z+1/2', '1/4, 1/4, -z', '1/4, 1/4, -z+1/2', '3/4, 3/4, -z', '3/4, 3/4, -z+1/2', '3/4, 3/4, z', '3/4, 3/4, z+1/2'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 0, 0', '0, 1/2, 0', '0, 0, 1/2', '1/2, 1/2, 1/2'], ['3/4, 1/4, 3/4', '1/4, 3/4, 1/4', '3/4, 1/4, 1/4', '1/4, 3/4, 3/4'], ['1/4, 1/4, 1/4', '1/4, 1/4, 3/4', '3/4, 3/4, 3/4', '3/4, 3/4, 1/4'], ['3/4, 1/4, 0', '1/4, 3/4, 1/2', '1/4, 3/4, 0', '3/4, 1/4, 1/2'], ['1/4, 1/4, 0', '1/4, 1/4, 1/2', '3/4, 3/4, 0', '3/4, 3/4, 1/2']]" +134,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z+1/2', 'y, -x+1/2, z+1/2', '-x+1/2, y, -z+1/2', 'x, -y+1/2, -z+1/2', 'y, x, -z', '-y+1/2, -x+1/2, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z+1/2', '-y, x+1/2, -z+1/2', 'x+1/2, -y, z+1/2', '-x, y+1/2, z+1/2', '-y, -x, z', 'y+1/2, x+1/2, z'], ['x, -x, z', '-x+1/2, x+1/2, z', 'x+1/2, x, z+1/2', '-x, -x+1/2, z+1/2', '-x+1/2, -x, -z+1/2', 'x, x+1/2, -z+1/2', '-x, x, -z', 'x+1/2, -x+1/2, -z'], ['x, x, 1/2', '-x+1/2, -x+1/2, 1/2', '-x+1/2, x, 0', 'x, -x+1/2, 0', '-x, -x, 1/2', 'x+1/2, x+1/2, 1/2', 'x+1/2, -x, 0', '-x, x+1/2, 0'], ['x, x, 0', '-x+1/2, -x+1/2, 0', '-x+1/2, x, 1/2', 'x, -x+1/2, 1/2', '-x, -x, 0', 'x+1/2, x+1/2, 0', 'x+1/2, -x, 1/2', '-x, x+1/2, 1/2'], ['x, 1/4, 1/4', '-x+1/2, 1/4, 1/4', '1/4, x, 3/4', '1/4, -x+1/2, 3/4', '-x, 3/4, 3/4', 'x+1/2, 3/4, 3/4', '3/4, -x, 1/4', '3/4, x+1/2, 1/4'], ['x, 1/4, 3/4', '-x+1/2, 1/4, 3/4', '1/4, x, 1/4', '1/4, -x+1/2, 1/4', '-x, 3/4, 1/4', 'x+1/2, 3/4, 1/4', '3/4, -x, 3/4', '3/4, x+1/2, 3/4'], ['1/4, 1/4, z', '1/4, 1/4, z+1/2', '1/4, 1/4, -z+1/2', '1/4, 1/4, -z', '3/4, 3/4, -z', '3/4, 3/4, -z+1/2', '3/4, 3/4, z+1/2', '3/4, 3/4, z'], ['3/4, 1/4, z', '1/4, 3/4, z+1/2', '3/4, 1/4, -z+1/2', '1/4, 3/4, -z'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 0, 0', '0, 1/2, 0'], ['1/4, 1/4, 0', '1/4, 1/4, 1/2', '3/4, 3/4, 0', '3/4, 3/4, 1/2'], ['1/4, 1/4, 1/4', '1/4, 1/4, 3/4', '3/4, 3/4, 3/4', '3/4, 3/4, 1/4'], ['3/4, 1/4, 1/4', '1/4, 3/4, 3/4'], ['1/4, 3/4, 1/4', '3/4, 1/4, 3/4']]" +135,"[['x, y, z', '-x, -y, z', '-y, x, z+1/2', 'y, -x, z+1/2', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', '-x, -y, -z', 'x, y, -z', 'y, -x, -z+1/2', '-y, x, -z+1/2', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 1/2', 'y, -x, 1/2', '-x+1/2, y+1/2, 0', 'x+1/2, -y+1/2, 0', 'y+1/2, x+1/2, 1/2', '-y+1/2, -x+1/2, 1/2'], ['x, x+1/2, 1/4', '-x, -x+1/2, 1/4', '-x+1/2, x, 3/4', 'x+1/2, -x, 3/4', '-x, -x+1/2, 3/4', 'x, x+1/2, 3/4', 'x+1/2, -x, 1/4', '-x+1/2, x, 1/4'], ['0, 1/2, z', '1/2, 0, z+1/2', '1/2, 0, -z', '0, 1/2, -z+1/2', '0, 1/2, -z', '1/2, 0, -z+1/2', '1/2, 0, z', '0, 1/2, z+1/2'], ['0, 0, z', '0, 0, z+1/2', '1/2, 1/2, -z', '1/2, 1/2, -z+1/2', '0, 0, -z', '0, 0, -z+1/2', '1/2, 1/2, z', '1/2, 1/2, z+1/2'], ['0, 1/2, 1/4', '1/2, 0, 3/4', '0, 1/2, 3/4', '1/2, 0, 1/4'], ['0, 1/2, 0', '1/2, 0, 1/2', '1/2, 0, 0', '0, 1/2, 1/2'], ['0, 0, 1/4', '0, 0, 3/4', '1/2, 1/2, 3/4', '1/2, 1/2, 1/4'], ['0, 0, 0', '0, 0, 1/2', '1/2, 1/2, 0', '1/2, 1/2, 1/2']]" +136,"[['x, y, z', '-x, -y, z', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'y, x, -z', '-y, -x, -z', '-x, -y, -z', 'x, y, -z', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-y, -x, z', 'y, x, z'], ['x, x, z', '-x, -x, z', '-x+1/2, x+1/2, z+1/2', 'x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, -z+1/2', 'x+1/2, -x+1/2, -z+1/2', 'x, x, -z', '-x, -x, -z'], ['x, y, 0', '-x, -y, 0', '-y+1/2, x+1/2, 1/2', 'y+1/2, -x+1/2, 1/2', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2', 'y, x, 0', '-y, -x, 0'], ['0, 1/2, z', '0, 1/2, z+1/2', '1/2, 0, -z+1/2', '1/2, 0, -z', '0, 1/2, -z', '0, 1/2, -z+1/2', '1/2, 0, z+1/2', '1/2, 0, z'], ['x, -x, 0', '-x, x, 0', 'x+1/2, x+1/2, 1/2', '-x+1/2, -x+1/2, 1/2'], ['x, x, 0', '-x, -x, 0', '-x+1/2, x+1/2, 1/2', 'x+1/2, -x+1/2, 1/2'], ['0, 0, z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2', '0, 0, -z'], ['0, 1/2, 1/4', '0, 1/2, 3/4', '1/2, 0, 1/4', '1/2, 0, 3/4'], ['0, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 0, 0'], ['0, 0, 1/2', '1/2, 1/2, 0'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +137,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z+1/2', 'y, -x+1/2, z+1/2', '-x, y+1/2, -z', 'x+1/2, -y, -z', 'y+1/2, x+1/2, -z+1/2', '-y, -x, -z+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z+1/2', '-y, x+1/2, -z+1/2', 'x, -y+1/2, z', '-x+1/2, y, z', '-y+1/2, -x+1/2, z+1/2', 'y, x, z+1/2'], ['1/4, y, z', '1/4, -y+1/2, z', '-y+1/2, 1/4, z+1/2', 'y, 1/4, z+1/2', '3/4, y+1/2, -z', '3/4, -y, -z', 'y+1/2, 3/4, -z+1/2', '-y, 3/4, -z+1/2'], ['x, -x, 1/4', '-x+1/2, x+1/2, 1/4', 'x+1/2, x, 3/4', '-x, -x+1/2, 3/4', '-x, x, 3/4', 'x+1/2, -x+1/2, 3/4', '-x+1/2, -x, 1/4', 'x, x+1/2, 1/4'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '0, 1/2, 0', '1/2, 0, 0', '1/2, 1/2, 1/2', '0, 0, 1/2'], ['1/4, 1/4, z', '1/4, 1/4, z+1/2', '3/4, 3/4, -z', '3/4, 3/4, -z+1/2'], ['3/4, 1/4, z', '1/4, 3/4, z+1/2', '1/4, 3/4, -z', '3/4, 1/4, -z+1/2'], ['3/4, 1/4, 1/4', '1/4, 3/4, 3/4'], ['3/4, 1/4, 3/4', '1/4, 3/4, 1/4']]" +138,"[['x, y, z', '-x+1/2, -y+1/2, z', '-y+1/2, x, z+1/2', 'y, -x+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y, -z+1/2', 'y+1/2, x+1/2, -z', '-y, -x, -z', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'y+1/2, -x, -z+1/2', '-y, x+1/2, -z+1/2', 'x, -y+1/2, z+1/2', '-x+1/2, y, z+1/2', '-y+1/2, -x+1/2, z', 'y, x, z'], ['x, x, z', '-x+1/2, -x+1/2, z', '-x+1/2, x, z+1/2', 'x, -x+1/2, z+1/2', '-x, x+1/2, -z+1/2', 'x+1/2, -x, -z+1/2', 'x+1/2, x+1/2, -z', '-x, -x, -z'], ['x, -x, 0', '-x+1/2, x+1/2, 0', 'x+1/2, x, 1/2', '-x, -x+1/2, 1/2', '-x, x, 0', 'x+1/2, -x+1/2, 0', '-x+1/2, -x, 1/2', 'x, x+1/2, 1/2'], ['x, -x, 1/2', '-x+1/2, x+1/2, 1/2', 'x+1/2, x, 0', '-x, -x+1/2, 0', '-x, x, 1/2', 'x+1/2, -x+1/2, 1/2', '-x+1/2, -x, 0', 'x, x+1/2, 0'], ['3/4, 1/4, z', '1/4, 3/4, z+1/2', '1/4, 3/4, -z+1/2', '3/4, 1/4, -z', '1/4, 3/4, -z', '3/4, 1/4, -z+1/2', '3/4, 1/4, z+1/2', '1/4, 3/4, z'], ['1/4, 1/4, z', '1/4, 1/4, z+1/2', '3/4, 3/4, -z+1/2', '3/4, 3/4, -z'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 0, 0', '0, 1/2, 0'], ['3/4, 1/4, 3/4', '1/4, 3/4, 1/4', '1/4, 3/4, 3/4', '3/4, 1/4, 1/4'], ['3/4, 1/4, 0', '1/4, 3/4, 1/2', '1/4, 3/4, 0', '3/4, 1/4, 1/2']]" +139,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, y, -z', 'x, -y, -z', 'y, x, -z', '-y, -x, -z', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x, -y, z', '-x, y, z', '-y, -x, z', 'y, x, z', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2'], ['0, y, z', '0, -y, z', '-y, 0, z', 'y, 0, z', '0, y, -z', '0, -y, -z', 'y, 0, -z', '-y, 0, -z', '1/2, y+1/2, z+1/2', '1/2, -y+1/2, z+1/2', '-y+1/2, 1/2, z+1/2', 'y+1/2, 1/2, z+1/2', '1/2, y+1/2, -z+1/2', '1/2, -y+1/2, -z+1/2', 'y+1/2, 1/2, -z+1/2', '-y+1/2, 1/2, -z+1/2'], ['x, x, z', '-x, -x, z', '-x, x, z', 'x, -x, z', '-x, x, -z', 'x, -x, -z', 'x, x, -z', '-x, -x, -z', 'x+1/2, x+1/2, z+1/2', '-x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, z+1/2', 'x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, -z+1/2', 'x+1/2, -x+1/2, -z+1/2', 'x+1/2, x+1/2, -z+1/2', '-x+1/2, -x+1/2, -z+1/2'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', '-x, y, 0', 'x, -y, 0', 'y, x, 0', '-y, -x, 0', 'x+1/2, y+1/2, 1/2', '-x+1/2, -y+1/2, 1/2', '-y+1/2, x+1/2, 1/2', 'y+1/2, -x+1/2, 1/2', '-x+1/2, y+1/2, 1/2', 'x+1/2, -y+1/2, 1/2', 'y+1/2, x+1/2, 1/2', '-y+1/2, -x+1/2, 1/2'], ['x, x+1/2, 1/4', '-x, -x+1/2, 1/4', '-x+1/2, x, 1/4', 'x+1/2, -x, 1/4', '-x, -x+1/2, 3/4', 'x, x+1/2, 3/4', 'x+1/2, -x, 3/4', '-x+1/2, x, 3/4', 'x+1/2, x+1, 3/4', '-x+1/2, -x+1, 3/4', '-x+1, x+1/2, 3/4', 'x+1, -x+1/2, 3/4', '-x+1/2, -x+1, 5/4', 'x+1/2, x+1, 5/4', 'x+1, -x+1/2, 5/4', '-x+1, x+1/2, 5/4'], ['x, 1/2, 0', '-x, 1/2, 0', '1/2, x, 0', '1/2, -x, 0', 'x+1/2, 1, 1/2', '-x+1/2, 1, 1/2', '1, x+1/2, 1/2', '1, -x+1/2, 1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2'], ['x, x, 0', '-x, -x, 0', '-x, x, 0', 'x, -x, 0', 'x+1/2, x+1/2, 1/2', '-x+1/2, -x+1/2, 1/2', '-x+1/2, x+1/2, 1/2', 'x+1/2, -x+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z', '1/2, 0, -z', '1/2, 1, z+1/2', '1, 1/2, z+1/2', '1/2, 1, -z+1/2', '1, 1/2, -z+1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 1/4', '1/4, 3/4, 1/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 3/4', '3/4, 5/4, 3/4'], ['0, 0, z', '0, 0, -z', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1/2'], ['0, 1/2, 1/4', '1/2, 0, 1/4', '1/2, 1, 3/4', '1, 1/2, 3/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 1, 1/2', '1, 1/2, 1/2'], ['0, 0, 1/2', '1/2, 1/2, 1'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +140,"[['x, y, z', '-x, -y, z', '-y, x, z', 'y, -x, z', '-x, y, -z+1/2', 'x, -y, -z+1/2', 'y, x, -z+1/2', '-y, -x, -z+1/2', '-x, -y, -z', 'x, y, -z', 'y, -x, -z', '-y, x, -z', 'x, -y, z+1/2', '-x, y, z+1/2', '-y, -x, z+1/2', 'y, x, z+1/2', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'y+1/2, -x+1/2, z+1/2', '-x+1/2, y+1/2, -z+1', 'x+1/2, -y+1/2, -z+1', 'y+1/2, x+1/2, -z+1', '-y+1/2, -x+1/2, -z+1', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1', '-x+1/2, y+1/2, z+1', '-y+1/2, -x+1/2, z+1', 'y+1/2, x+1/2, z+1'], ['x, x+1/2, z', '-x, -x+1/2, z', '-x+1/2, x, z', 'x+1/2, -x, z', '-x, x+1/2, -z+1/2', 'x, -x+1/2, -z+1/2', 'x+1/2, x, -z+1/2', '-x+1/2, -x, -z+1/2', 'x+1/2, x+1, z+1/2', '-x+1/2, -x+1, z+1/2', '-x+1, x+1/2, z+1/2', 'x+1, -x+1/2, z+1/2', '-x+1/2, x+1, -z+1', 'x+1/2, -x+1, -z+1', 'x+1, x+1/2, -z+1', '-x+1, -x+1/2, -z+1'], ['x, y, 0', '-x, -y, 0', '-y, x, 0', 'y, -x, 0', '-x, y, 1/2', 'x, -y, 1/2', 'y, x, 1/2', '-y, -x, 1/2', 'x+1/2, y+1/2, 1/2', '-x+1/2, -y+1/2, 1/2', '-y+1/2, x+1/2, 1/2', 'y+1/2, -x+1/2, 1/2', '-x+1/2, y+1/2, 1', 'x+1/2, -y+1/2, 1', 'y+1/2, x+1/2, 1', '-y+1/2, -x+1/2, 1'], ['x, 0, 1/4', '-x, 0, 1/4', '0, x, 1/4', '0, -x, 1/4', '-x, 0, 3/4', 'x, 0, 3/4', '0, -x, 3/4', '0, x, 3/4', 'x+1/2, 1/2, 3/4', '-x+1/2, 1/2, 3/4', '1/2, x+1/2, 3/4', '1/2, -x+1/2, 3/4', '-x+1/2, 1/2, 5/4', 'x+1/2, 1/2, 5/4', '1/2, -x+1/2, 5/4', '1/2, x+1/2, 5/4'], ['x, x, 1/4', '-x, -x, 1/4', '-x, x, 1/4', 'x, -x, 1/4', '-x, -x, 3/4', 'x, x, 3/4', 'x, -x, 3/4', '-x, x, 3/4', 'x+1/2, x+1/2, 3/4', '-x+1/2, -x+1/2, 3/4', '-x+1/2, x+1/2, 3/4', 'x+1/2, -x+1/2, 3/4', '-x+1/2, -x+1/2, 5/4', 'x+1/2, x+1/2, 5/4', 'x+1/2, -x+1/2, 5/4', '-x+1/2, x+1/2, 5/4'], ['x, x+1/2, 0', '-x, -x+1/2, 0', '-x+1/2, x, 0', 'x+1/2, -x, 0', 'x+1/2, x+1, 1/2', '-x+1/2, -x+1, 1/2', '-x+1, x+1/2, 1/2', 'x+1, -x+1/2, 1/2'], ['0, 1/2, z', '1/2, 0, z', '0, 1/2, -z+1/2', '1/2, 0, -z+1/2', '1/2, 1, z+1/2', '1, 1/2, z+1/2', '1/2, 1, -z+1', '1, 1/2, -z+1'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2', '1/2, 1/2, z+1/2', '1/2, 1/2, -z+1', '1/2, 1/2, -z+1/2', '1/2, 1/2, z+1'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 1/4', '1/4, 3/4, 1/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 3/4', '3/4, 5/4, 3/4'], ['0, 1/2, 0', '1/2, 0, 0', '1/2, 1, 1/2', '1, 1/2, 1/2'], ['0, 0, 0', '0, 0, 1/2', '1/2, 1/2, 1/2', '1/2, 1/2, 1'], ['0, 1/2, 1/4', '1/2, 0, 1/4', '1/2, 1, 3/4', '1, 1/2, 3/4'], ['0, 0, 1/4', '0, 0, 3/4', '1/2, 1/2, 3/4', '1/2, 1/2, 5/4']]" +141,"[['x, y, z', '-x+1/2, -y, z+1/2', '-y+1/4, x+3/4, z+1/4', 'y+1/4, -x+1/4, z+3/4', '-x+1/2, y, -z+1/2', 'x, -y, -z', 'y+1/4, x+3/4, -z+1/4', '-y+1/4, -x+1/4, -z+3/4', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'y+3/4, -x+1/4, -z+3/4', '-y+3/4, x+3/4, -z+1/4', 'x+1/2, -y, z+1/2', '-x, y, z', '-y+3/4, -x+1/4, z+3/4', 'y+3/4, x+3/4, z+1/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-y+3/4, x+5/4, z+3/4', 'y+3/4, -x+3/4, z+5/4', '-x+1, y+1/2, -z+1', 'x+1/2, -y+1/2, -z+1/2', 'y+3/4, x+5/4, -z+3/4', '-y+3/4, -x+3/4, -z+5/4', '-x+1/2, -y+1/2, -z+1/2', 'x+1, y+1/2, -z+1', 'y+5/4, -x+3/4, -z+5/4', '-y+5/4, x+5/4, -z+3/4', 'x+1, -y+1/2, z+1', '-x+1/2, y+1/2, z+1/2', '-y+5/4, -x+3/4, z+5/4', 'y+5/4, x+5/4, z+3/4'], ['0, y, z', '1/2, -y, z+1/2', '-y+1/4, 3/4, z+1/4', 'y+1/4, 1/4, z+3/4', '1/2, y, -z+1/2', '0, -y, -z', 'y+1/4, 3/4, -z+1/4', '-y+1/4, 1/4, -z+3/4', '1/2, y+1/2, z+1/2', '1, -y+1/2, z+1', '-y+3/4, 5/4, z+3/4', 'y+3/4, 3/4, z+5/4', '1, y+1/2, -z+1', '1/2, -y+1/2, -z+1/2', 'y+3/4, 5/4, -z+3/4', '-y+3/4, 3/4, -z+5/4'], ['x, x+1/4, 7/8', '-x+1/2, -x+3/4, 3/8', '-x, x+3/4, 1/8', 'x+1/2, -x+1/4, 5/8', '-x, -x+3/4, 1/8', 'x+1/2, x+1/4, 5/8', 'x, -x+1/4, 7/8', '-x+1/2, x+3/4, 3/8', 'x+1/2, x+3/4, 11/8', '-x+1, -x+5/4, 7/8', '-x+1/2, x+5/4, 5/8', 'x+1, -x+3/4, 9/8', '-x+1/2, -x+5/4, 5/8', 'x+1, x+3/4, 9/8', 'x+1/2, -x+3/4, 11/8', '-x+1, x+5/4, 7/8'], ['x, 0, 0', '-x+1/2, 0, 1/2', '1/4, x+3/4, 1/4', '1/4, -x+1/4, 3/4', '-x, 0, 0', 'x+1/2, 0, 1/2', '3/4, -x+1/4, 3/4', '3/4, x+3/4, 1/4', 'x+1/2, 1/2, 1/2', '-x+1, 1/2, 1', '3/4, x+5/4, 3/4', '3/4, -x+3/4, 5/4', '-x+1/2, 1/2, 1/2', 'x+1, 1/2, 1', '5/4, -x+3/4, 5/4', '5/4, x+5/4, 3/4'], ['0, 1/4, z', '0, 3/4, z+1/4', '1/2, 1/4, -z+1/2', '1/2, 3/4, -z+1/4', '1/2, 3/4, z+1/2', '1/2, 5/4, z+3/4', '1, 3/4, -z+1', '1, 5/4, -z+3/4'], ['0, 0, 1/2', '1/2, 0, 0', '1/4, 3/4, 3/4', '1/4, 1/4, 1/4', '1/2, 1/2, 1', '1, 1/2, 1/2', '3/4, 5/4, 5/4', '3/4, 3/4, 3/4'], ['0, 0, 0', '1/2, 0, 1/2', '1/4, 3/4, 1/4', '1/4, 1/4, 3/4', '1/2, 1/2, 1/2', '1, 1/2, 1', '3/4, 5/4, 3/4', '3/4, 3/4, 5/4'], ['0, 1/4, 3/8', '0, 3/4, 5/8', '1/2, 3/4, 7/8', '1/2, 5/4, 9/8'], ['0, 3/4, 1/8', '1/2, 3/4, 3/8', '1/2, 5/4, 5/8', '1, 5/4, 7/8']]" +142,"[['x, y, z', '-x+1/2, -y, z+1/2', '-y+1/4, x+3/4, z+1/4', 'y+1/4, -x+1/4, z+3/4', '-x+1/2, y, -z', 'x, -y, -z+1/2', 'y+1/4, x+3/4, -z+3/4', '-y+1/4, -x+1/4, -z+1/4', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'y+3/4, -x+1/4, -z+3/4', '-y+3/4, x+3/4, -z+1/4', 'x+1/2, -y, z', '-x, y, z+1/2', '-y+3/4, -x+1/4, z+1/4', 'y+3/4, x+3/4, z+3/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-y+3/4, x+5/4, z+3/4', 'y+3/4, -x+3/4, z+5/4', '-x+1, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1', 'y+3/4, x+5/4, -z+5/4', '-y+3/4, -x+3/4, -z+3/4', '-x+1/2, -y+1/2, -z+1/2', 'x+1, y+1/2, -z+1', 'y+5/4, -x+3/4, -z+5/4', '-y+5/4, x+5/4, -z+3/4', 'x+1, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1', '-y+5/4, -x+3/4, z+3/4', 'y+5/4, x+5/4, z+5/4'], ['x, x+1/4, 1/8', '-x+1/2, -x+3/4, 5/8', '-x, x+3/4, 3/8', 'x+1/2, -x+1/4, 7/8', '-x, -x+3/4, 7/8', 'x+1/2, x+1/4, 3/8', 'x, -x+1/4, 5/8', '-x+1/2, x+3/4, 1/8', 'x+1/2, x+3/4, 5/8', '-x+1, -x+5/4, 9/8', '-x+1/2, x+5/4, 7/8', 'x+1, -x+3/4, 11/8', '-x+1/2, -x+5/4, 11/8', 'x+1, x+3/4, 7/8', 'x+1/2, -x+3/4, 9/8', '-x+1, x+5/4, 5/8'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '1/4, x+3/4, 1/2', '1/4, -x+1/4, 0', '-x, 0, 3/4', 'x+1/2, 0, 1/4', '3/4, -x+1/4, 1/2', '3/4, x+3/4, 0', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '3/4, x+5/4, 1', '3/4, -x+3/4, 1/2', '-x+1/2, 1/2, 5/4', 'x+1, 1/2, 3/4', '5/4, -x+3/4, 1', '5/4, x+5/4, 1/2'], ['0, 1/4, z', '0, 3/4, z+1/4', '1/2, 1/4, -z', '1/2, 3/4, -z+3/4', '0, 3/4, -z', '0, 1/4, -z+3/4', '1/2, 3/4, z', '1/2, 1/4, z+1/4', '1/2, 3/4, z+1/2', '1/2, 5/4, z+3/4', '1, 3/4, -z+1/2', '1, 5/4, -z+5/4', '1/2, 5/4, -z+1/2', '1/2, 3/4, -z+5/4', '1, 5/4, z+1/2', '1, 3/4, z+3/4'], ['0, 0, 0', '1/2, 0, 1/2', '1/4, 3/4, 1/4', '1/4, 1/4, 3/4', '1/2, 0, 0', '0, 0, 1/2', '1/4, 3/4, 3/4', '1/4, 1/4, 1/4', '1/2, 1/2, 1/2', '1, 1/2, 1', '3/4, 5/4, 3/4', '3/4, 3/4, 5/4', '1, 1/2, 1/2', '1/2, 1/2, 1', '3/4, 5/4, 5/4', '3/4, 3/4, 3/4'], ['0, 1/4, 1/8', '0, 3/4, 3/8', '0, 3/4, 7/8', '0, 1/4, 5/8', '1/2, 3/4, 5/8', '1/2, 5/4, 7/8', '1/2, 5/4, 11/8', '1/2, 3/4, 9/8'], ['0, 1/4, 3/8', '0, 3/4, 5/8', '1/2, 1/4, 5/8', '1/2, 3/4, 3/8', '1/2, 3/4, 7/8', '1/2, 5/4, 9/8', '1, 3/4, 9/8', '1, 5/4, 7/8']]" +143,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z'], ['2/3, 1/3, z'], ['1/3, 2/3, z'], ['0, 0, z']]" +144,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3']]" +145,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3']]" +146,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3'], ['0, 0, z', '2/3, 1/3, z+1/3', '1/3, 2/3, z+2/3']]" +147,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0'], ['1/3, 2/3, z', '2/3, 1/3, -z'], ['0, 0, z', '0, 0, -z'], ['0, 0, 1/2'], ['0, 0, 0']]" +148,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', '-x+2/3, -y+1/3, -z+1/3', 'y+2/3, -x+y+1/3, -z+1/3', 'x-y+2/3, x+1/3, -z+1/3', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3', '-x+1/3, -y+2/3, -z+2/3', 'y+1/3, -x+y+2/3, -z+2/3', 'x-y+1/3, x+2/3, -z+2/3'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '7/6, 1/3, 1/3', '2/3, 5/6, 1/3', '7/6, 5/6, 1/3', '5/6, 2/3, 2/3', '1/3, 7/6, 2/3', '5/6, 7/6, 2/3'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2', '7/6, 1/3, 5/6', '2/3, 5/6, 5/6', '7/6, 5/6, 5/6', '5/6, 2/3, 7/6', '1/3, 7/6, 7/6', '5/6, 7/6, 7/6'], ['0, 0, z', '0, 0, -z', '2/3, 1/3, z+1/3', '2/3, 1/3, -z+1/3', '1/3, 2/3, z+2/3', '1/3, 2/3, -z+2/3'], ['0, 0, 1/2', '2/3, 1/3, 5/6', '1/3, 2/3, 7/6'], ['0, 0, 0', '2/3, 1/3, 1/3', '1/3, 2/3, 2/3']]" +149,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z'], ['x, -x, 1/2', 'x, 2x, 1/2', '-2x, -x, 1/2'], ['x, -x, 0', 'x, 2x, 0', '-2x, -x, 0'], ['2/3, 1/3, z', '2/3, 1/3, -z'], ['1/3, 2/3, z', '1/3, 2/3, -z'], ['0, 0, z', '0, 0, -z'], ['2/3, 1/3, 1/2'], ['2/3, 1/3, 0'], ['1/3, 2/3, 1/2'], ['1/3, 2/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +150,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2'], ['x, 0, 0', '0, x, 0', '-x, -x, 0'], ['1/3, 2/3, z', '2/3, 1/3, -z'], ['0, 0, z', '0, 0, -z'], ['0, 0, 1/2'], ['0, 0, 0']]" +151,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3', '-y, -x, -z+2/3', '-x+y, y, -z+1/3', 'x, x-y, -z'], ['x, -x, 5/6', 'x, 2x, 1/6', '-2x, -x, 1/2'], ['x, -x, 1/3', 'x, 2x, 2/3', '-2x, -x, 0']]" +152,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3', 'y, x, -z', 'x-y, -y, -z+2/3', '-x, -x+y, -z+1/3'], ['x, 0, 5/6', '0, x, 1/6', '-x, -x, 1/2'], ['x, 0, 1/3', '0, x, 2/3', '-x, -x, 0']]" +153,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3', '-y, -x, -z+1/3', '-x+y, y, -z+2/3', 'x, x-y, -z'], ['x, -x, 1/6', 'x, 2x, 5/6', '-2x, -x, 1/2'], ['x, -x, 2/3', 'x, 2x, 1/3', '-2x, -x, 0']]" +154,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3', 'y, x, -z', 'x-y, -y, -z+1/3', '-x, -x+y, -z+2/3'], ['x, 0, 1/6', '0, x, 5/6', '-x, -x, 1/2'], ['x, 0, 2/3', '0, x, 1/3', '-x, -x, 0']]" +155,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', 'y+2/3, x+1/3, -z+1/3', 'x-y+2/3, -y+1/3, -z+1/3', '-x+2/3, -x+y+1/3, -z+1/3', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3', 'y+1/3, x+2/3, -z+2/3', 'x-y+1/3, -y+2/3, -z+2/3', '-x+1/3, -x+y+2/3, -z+2/3'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2', 'x+2/3, 1/3, 5/6', '2/3, x+1/3, 5/6', '-x+2/3, -x+1/3, 5/6', 'x+1/3, 2/3, 7/6', '1/3, x+2/3, 7/6', '-x+1/3, -x+2/3, 7/6'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', 'x+2/3, 1/3, 1/3', '2/3, x+1/3, 1/3', '-x+2/3, -x+1/3, 1/3', 'x+1/3, 2/3, 2/3', '1/3, x+2/3, 2/3', '-x+1/3, -x+2/3, 2/3'], ['0, 0, z', '0, 0, -z', '2/3, 1/3, z+1/3', '2/3, 1/3, -z+1/3', '1/3, 2/3, z+2/3', '1/3, 2/3, -z+2/3'], ['0, 0, 1/2', '2/3, 1/3, 5/6', '1/3, 2/3, 7/6'], ['0, 0, 0', '2/3, 1/3, 1/3', '1/3, 2/3, 2/3']]" +156,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z'], ['2/3, 1/3, z'], ['1/3, 2/3, z'], ['0, 0, z']]" +157,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, 0, z', '0, x, z', '-x, -x, z'], ['1/3, 2/3, z', '2/3, 1/3, z'], ['0, 0, z']]" +158,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2'], ['2/3, 1/3, z', '2/3, 1/3, z+1/2'], ['1/3, 2/3, z', '1/3, 2/3, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +159,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +160,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', '-y+2/3, -x+1/3, z+1/3', '-x+y+2/3, y+1/3, z+1/3', 'x+2/3, x-y+1/3, z+1/3', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3', '-y+1/3, -x+2/3, z+2/3', '-x+y+1/3, y+2/3, z+2/3', 'x+1/3, x-y+2/3, z+2/3'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z', 'x+2/3, -x+1/3, z+1/3', 'x+2/3, 2x+1/3, z+1/3', '-2x+2/3, -x+1/3, z+1/3', 'x+1/3, -x+2/3, z+2/3', 'x+1/3, 2x+2/3, z+2/3', '-2x+1/3, -x+2/3, z+2/3'], ['0, 0, z', '2/3, 1/3, z+1/3', '1/3, 2/3, z+2/3']]" +161,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', '-y+2/3, -x+1/3, z+5/6', '-x+y+2/3, y+1/3, z+5/6', 'x+2/3, x-y+1/3, z+5/6', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3', '-y+1/3, -x+2/3, z+7/6', '-x+y+1/3, y+2/3, z+7/6', 'x+1/3, x-y+2/3, z+7/6'], ['0, 0, z', '0, 0, z+1/2', '2/3, 1/3, z+1/3', '2/3, 1/3, z+5/6', '1/3, 2/3, z+2/3', '1/3, 2/3, z+7/6']]" +162,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, 0, z', '0, x, z', '-x, -x, z', '0, -x, -z', '-x, 0, -z', 'x, x, -z'], ['x, -x, 1/2', 'x, 2x, 1/2', '-2x, -x, 1/2', '-x, x, 1/2', '-x, -2x, 1/2', '2x, x, 1/2'], ['x, -x, 0', 'x, 2x, 0', '-2x, -x, 0', '-x, x, 0', '-x, -2x, 0', '2x, x, 0'], ['1/3, 2/3, z', '1/3, 2/3, -z', '2/3, 1/3, -z', '2/3, 1/3, z'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0'], ['0, 0, z', '0, 0, -z'], ['1/3, 2/3, 1/2', '2/3, 1/3, 1/2'], ['1/3, 2/3, 0', '2/3, 1/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +163,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-y, -x, -z+1/2', '-x+y, y, -z+1/2', 'x, x-y, -z+1/2', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['x, -x, 1/4', 'x, 2x, 1/4', '-2x, -x, 1/4', '-x, x, 3/4', '-x, -2x, 3/4', '2x, x, 3/4'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 1/2'], ['1/3, 2/3, z', '1/3, 2/3, -z+1/2', '2/3, 1/3, -z', '2/3, 1/3, z+1/2'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2'], ['2/3, 1/3, 1/4', '1/3, 2/3, 3/4'], ['1/3, 2/3, 1/4', '2/3, 1/3, 3/4'], ['0, 0, 0', '0, 0, 1/2'], ['0, 0, 1/4', '0, 0, 3/4']]" +164,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z', '-x, x, -z', '2x, x, -z', '-x, -2x, -z'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2', '-x, 0, 1/2', '0, -x, 1/2', 'x, x, 1/2'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', '-x, 0, 0', '0, -x, 0', 'x, x, 0'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0'], ['1/3, 2/3, z', '2/3, 1/3, -z'], ['0, 0, z', '0, 0, -z'], ['0, 0, 1/2'], ['0, 0, 0']]" +165,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, -z+1/2', 'x-y, -y, -z+1/2', '-x, -x+y, -z+1/2', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2'], ['x, 0, 1/4', '0, x, 1/4', '-x, -x, 1/4', '-x, 0, 3/4', '0, -x, 3/4', 'x, x, 3/4'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 1/2'], ['1/3, 2/3, z', '2/3, 1/3, -z+1/2', '2/3, 1/3, -z', '1/3, 2/3, z+1/2'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2'], ['0, 0, 0', '0, 0, 1/2'], ['0, 0, 1/4', '0, 0, 3/4']]" +166,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', 'y+2/3, x+1/3, -z+1/3', 'x-y+2/3, -y+1/3, -z+1/3', '-x+2/3, -x+y+1/3, -z+1/3', '-x+2/3, -y+1/3, -z+1/3', 'y+2/3, -x+y+1/3, -z+1/3', 'x-y+2/3, x+1/3, -z+1/3', '-y+2/3, -x+1/3, z+1/3', '-x+y+2/3, y+1/3, z+1/3', 'x+2/3, x-y+1/3, z+1/3', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3', 'y+1/3, x+2/3, -z+2/3', 'x-y+1/3, -y+2/3, -z+2/3', '-x+1/3, -x+y+2/3, -z+2/3', '-x+1/3, -y+2/3, -z+2/3', 'y+1/3, -x+y+2/3, -z+2/3', 'x-y+1/3, x+2/3, -z+2/3', '-y+1/3, -x+2/3, z+2/3', '-x+y+1/3, y+2/3, z+2/3', 'x+1/3, x-y+2/3, z+2/3'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z', '-x, x, -z', '2x, x, -z', '-x, -2x, -z', 'x+2/3, -x+1/3, z+1/3', 'x+2/3, 2x+1/3, z+1/3', '-2x+2/3, -x+1/3, z+1/3', '-x+2/3, x+1/3, -z+1/3', '2x+2/3, x+1/3, -z+1/3', '-x+2/3, -2x+1/3, -z+1/3', 'x+1/3, -x+2/3, z+2/3', 'x+1/3, 2x+2/3, z+2/3', '-2x+1/3, -x+2/3, z+2/3', '-x+1/3, x+2/3, -z+2/3', '2x+1/3, x+2/3, -z+2/3', '-x+1/3, -2x+2/3, -z+2/3'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2', '-x, 0, 1/2', '0, -x, 1/2', 'x, x, 1/2', 'x+2/3, 1/3, 5/6', '2/3, x+1/3, 5/6', '-x+2/3, -x+1/3, 5/6', '-x+2/3, 1/3, 5/6', '2/3, -x+1/3, 5/6', 'x+2/3, x+1/3, 5/6', 'x+1/3, 2/3, 7/6', '1/3, x+2/3, 7/6', '-x+1/3, -x+2/3, 7/6', '-x+1/3, 2/3, 7/6', '1/3, -x+2/3, 7/6', 'x+1/3, x+2/3, 7/6'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', '-x, 0, 0', '0, -x, 0', 'x, x, 0', 'x+2/3, 1/3, 1/3', '2/3, x+1/3, 1/3', '-x+2/3, -x+1/3, 1/3', '-x+2/3, 1/3, 1/3', '2/3, -x+1/3, 1/3', 'x+2/3, x+1/3, 1/3', 'x+1/3, 2/3, 2/3', '1/3, x+2/3, 2/3', '-x+1/3, -x+2/3, 2/3', '-x+1/3, 2/3, 2/3', '1/3, -x+2/3, 2/3', 'x+1/3, x+2/3, 2/3'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '7/6, 1/3, 1/3', '2/3, 5/6, 1/3', '7/6, 5/6, 1/3', '5/6, 2/3, 2/3', '1/3, 7/6, 2/3', '5/6, 7/6, 2/3'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2', '7/6, 1/3, 5/6', '2/3, 5/6, 5/6', '7/6, 5/6, 5/6', '5/6, 2/3, 7/6', '1/3, 7/6, 7/6', '5/6, 7/6, 7/6'], ['0, 0, z', '0, 0, -z', '2/3, 1/3, z+1/3', '2/3, 1/3, -z+1/3', '1/3, 2/3, z+2/3', '1/3, 2/3, -z+2/3'], ['0, 0, 1/2', '2/3, 1/3, 5/6', '1/3, 2/3, 7/6'], ['0, 0, 0', '2/3, 1/3, 1/3', '1/3, 2/3, 2/3']]" +167,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'y, x, -z+1/2', 'x-y, -y, -z+1/2', '-x, -x+y, -z+1/2', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', 'x+2/3, y+1/3, z+1/3', '-y+2/3, x-y+1/3, z+1/3', '-x+y+2/3, -x+1/3, z+1/3', 'y+2/3, x+1/3, -z+5/6', 'x-y+2/3, -y+1/3, -z+5/6', '-x+2/3, -x+y+1/3, -z+5/6', '-x+2/3, -y+1/3, -z+1/3', 'y+2/3, -x+y+1/3, -z+1/3', 'x-y+2/3, x+1/3, -z+1/3', '-y+2/3, -x+1/3, z+5/6', '-x+y+2/3, y+1/3, z+5/6', 'x+2/3, x-y+1/3, z+5/6', 'x+1/3, y+2/3, z+2/3', '-y+1/3, x-y+2/3, z+2/3', '-x+y+1/3, -x+2/3, z+2/3', 'y+1/3, x+2/3, -z+7/6', 'x-y+1/3, -y+2/3, -z+7/6', '-x+1/3, -x+y+2/3, -z+7/6', '-x+1/3, -y+2/3, -z+2/3', 'y+1/3, -x+y+2/3, -z+2/3', 'x-y+1/3, x+2/3, -z+2/3', '-y+1/3, -x+2/3, z+7/6', '-x+y+1/3, y+2/3, z+7/6', 'x+1/3, x-y+2/3, z+7/6'], ['x, 0, 1/4', '0, x, 1/4', '-x, -x, 1/4', '-x, 0, 3/4', '0, -x, 3/4', 'x, x, 3/4', 'x+2/3, 1/3, 7/12', '2/3, x+1/3, 7/12', '-x+2/3, -x+1/3, 7/12', '-x+2/3, 1/3, 13/12', '2/3, -x+1/3, 13/12', 'x+2/3, x+1/3, 13/12', 'x+1/3, 2/3, 11/12', '1/3, x+2/3, 11/12', '-x+1/3, -x+2/3, 11/12', '-x+1/3, 2/3, 17/12', '1/3, -x+2/3, 17/12', 'x+1/3, x+2/3, 17/12'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 1/2', '7/6, 1/3, 1/3', '2/3, 5/6, 1/3', '7/6, 5/6, 1/3', '2/3, 5/6, 5/6', '7/6, 1/3, 5/6', '7/6, 5/6, 5/6', '5/6, 2/3, 2/3', '1/3, 7/6, 2/3', '5/6, 7/6, 2/3', '1/3, 7/6, 7/6', '5/6, 2/3, 7/6', '5/6, 7/6, 7/6'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2', '2/3, 1/3, z+1/3', '2/3, 1/3, -z+5/6', '2/3, 1/3, -z+1/3', '2/3, 1/3, z+5/6', '1/3, 2/3, z+2/3', '1/3, 2/3, -z+7/6', '1/3, 2/3, -z+2/3', '1/3, 2/3, z+7/6'], ['0, 0, 0', '0, 0, 1/2', '2/3, 1/3, 1/3', '2/3, 1/3, 5/6', '1/3, 2/3, 2/3', '1/3, 2/3, 7/6'], ['0, 0, 1/4', '0, 0, 3/4', '2/3, 1/3, 7/12', '2/3, 1/3, 13/12', '1/3, 2/3, 11/12', '1/3, 2/3, 17/12']]" +168,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z'], ['1/3, 2/3, z', '2/3, 1/3, z'], ['0, 0, z']]" +169,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3', '-x, -y, z+1/2', 'y, -x+y, z+5/6', 'x-y, x, z+1/6']]" +170,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3', '-x, -y, z+1/2', 'y, -x+y, z+1/6', 'x-y, x, z+5/6']]" +171,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3', '-x, -y, z', 'y, -x+y, z+2/3', 'x-y, x, z+1/3'], ['1/2, 1/2, z', '1/2, 0, z+2/3', '0, 1/2, z+1/3'], ['0, 0, z', '0, 0, z+2/3', '0, 0, z+1/3']]" +172,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3', '-x, -y, z', 'y, -x+y, z+1/3', 'x-y, x, z+2/3'], ['1/2, 1/2, z', '1/2, 0, z+1/3', '0, 1/2, z+2/3'], ['0, 0, z', '0, 0, z+1/3', '0, 0, z+2/3']]" +173,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +174,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'x, y, -z', '-y, x-y, -z', '-x+y, -x, -z'], ['x, y, 1/2', '-y, x-y, 1/2', '-x+y, -x, 1/2'], ['x, y, 0', '-y, x-y, 0', '-x+y, -x, 0'], ['2/3, 1/3, z', '2/3, 1/3, -z'], ['1/3, 2/3, z', '1/3, 2/3, -z'], ['0, 0, z', '0, 0, -z'], ['2/3, 1/3, 1/2'], ['2/3, 1/3, 0'], ['1/3, 2/3, 1/2'], ['1/3, 2/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +175,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x, y, -z', '-y, x-y, -z', '-x+y, -x, -z'], ['x, y, 1/2', '-y, x-y, 1/2', '-x+y, -x, 1/2', '-x, -y, 1/2', 'y, -x+y, 1/2', 'x-y, x, 1/2'], ['x, y, 0', '-y, x-y, 0', '-x+y, -x, 0', '-x, -y, 0', 'y, -x+y, 0', 'x-y, x, 0'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z', '1/2, 0, -z', '0, 1/2, -z', '1/2, 1/2, -z'], ['1/3, 2/3, z', '2/3, 1/3, z', '2/3, 1/3, -z', '1/3, 2/3, -z'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0'], ['0, 0, z', '0, 0, -z'], ['1/3, 2/3, 1/2', '2/3, 1/3, 1/2'], ['1/3, 2/3, 0', '2/3, 1/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +176,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x, y, -z+1/2', '-y, x-y, -z+1/2', '-x+y, -x, -z+1/2'], ['x, y, 1/4', '-y, x-y, 1/4', '-x+y, -x, 1/4', '-x, -y, 3/4', 'y, -x+y, 3/4', 'x-y, x, 3/4'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2', '2/3, 1/3, -z', '1/3, 2/3, -z+1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z', '0, 0, -z+1/2'], ['2/3, 1/3, 1/4', '1/3, 2/3, 3/4'], ['1/3, 2/3, 1/4', '2/3, 1/3, 3/4'], ['0, 0, 0', '0, 0, 1/2'], ['0, 0, 1/4', '0, 0, 3/4']]" +177,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z'], ['x, -x, 1/2', 'x, 2x, 1/2', '-2x, -x, 1/2', '-x, x, 1/2', '-x, -2x, 1/2', '2x, x, 1/2'], ['x, -x, 0', 'x, 2x, 0', '-2x, -x, 0', '-x, x, 0', '-x, -2x, 0', '2x, x, 0'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2', '-x, 0, 1/2', '0, -x, 1/2', 'x, x, 1/2'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', '-x, 0, 0', '0, -x, 0', 'x, x, 0'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z', '0, 1/2, -z', '1/2, 0, -z', '1/2, 1/2, -z'], ['1/3, 2/3, z', '2/3, 1/3, z', '2/3, 1/3, -z', '1/3, 2/3, -z'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0'], ['0, 0, z', '0, 0, -z'], ['1/3, 2/3, 1/2', '2/3, 1/3, 1/2'], ['1/3, 2/3, 0', '2/3, 1/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +178,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3', '-x, -y, z+1/2', 'y, -x+y, z+5/6', 'x-y, x, z+1/6', 'y, x, -z+1/3', 'x-y, -y, -z', '-x, -x+y, -z+2/3', '-y, -x, -z+5/6', '-x+y, y, -z+1/2', 'x, x-y, -z+1/6'], ['x, 2x, 1/4', '-2x, -x, 7/12', 'x, -x, 11/12', '-x, -2x, 3/4', '2x, x, 1/12', '-x, x, 5/12'], ['x, 0, 0', '0, x, 1/3', '-x, -x, 2/3', '-x, 0, 1/2', '0, -x, 5/6', 'x, x, 1/6']]" +179,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3', '-x, -y, z+1/2', 'y, -x+y, z+1/6', 'x-y, x, z+5/6', 'y, x, -z+2/3', 'x-y, -y, -z', '-x, -x+y, -z+1/3', '-y, -x, -z+1/6', '-x+y, y, -z+1/2', 'x, x-y, -z+5/6'], ['x, 2x, 3/4', '-2x, -x, 5/12', 'x, -x, 1/12', '-x, -2x, 1/4', '2x, x, 11/12', '-x, x, 7/12'], ['x, 0, 0', '0, x, 2/3', '-x, -x, 1/3', '-x, 0, 1/2', '0, -x, 1/6', 'x, x, 5/6']]" +180,"[['x, y, z', '-y, x-y, z+2/3', '-x+y, -x, z+1/3', '-x, -y, z', 'y, -x+y, z+2/3', 'x-y, x, z+1/3', 'y, x, -z+2/3', 'x-y, -y, -z', '-x, -x+y, -z+1/3', '-y, -x, -z+2/3', '-x+y, y, -z', 'x, x-y, -z+1/3'], ['x, 2x, 1/2', '-2x, -x, 1/6', 'x, -x, 5/6', '-x, -2x, 1/2', '2x, x, 1/6', '-x, x, 5/6'], ['x, 2x, 0', '-2x, -x, 2/3', 'x, -x, 1/3', '-x, -2x, 0', '2x, x, 2/3', '-x, x, 1/3'], ['x, 0, 1/2', '0, x, 1/6', '-x, -x, 5/6', '-x, 0, 1/2', '0, -x, 1/6', 'x, x, 5/6'], ['x, 0, 0', '0, x, 2/3', '-x, -x, 1/3', '-x, 0, 0', '0, -x, 2/3', 'x, x, 1/3'], ['1/2, 0, z', '0, 1/2, z+2/3', '1/2, 1/2, z+1/3', '0, 1/2, -z+2/3', '1/2, 0, -z', '1/2, 1/2, -z+1/3'], ['0, 0, z', '0, 0, z+2/3', '0, 0, z+1/3', '0, 0, -z+2/3', '0, 0, -z', '0, 0, -z+1/3'], ['1/2, 0, 1/2', '0, 1/2, 1/6', '1/2, 1/2, 5/6'], ['1/2, 0, 0', '0, 1/2, 2/3', '1/2, 1/2, 1/3'], ['0, 0, 1/2', '0, 0, 1/6', '0, 0, 5/6'], ['0, 0, 0', '0, 0, 2/3', '0, 0, 1/3']]" +181,"[['x, y, z', '-y, x-y, z+1/3', '-x+y, -x, z+2/3', '-x, -y, z', 'y, -x+y, z+1/3', 'x-y, x, z+2/3', 'y, x, -z+1/3', 'x-y, -y, -z', '-x, -x+y, -z+2/3', '-y, -x, -z+1/3', '-x+y, y, -z', 'x, x-y, -z+2/3'], ['x, 2x, 1/2', '-2x, -x, 5/6', 'x, -x, 1/6', '-x, -2x, 1/2', '2x, x, 5/6', '-x, x, 1/6'], ['x, 2x, 0', '-2x, -x, 1/3', 'x, -x, 2/3', '-x, -2x, 0', '2x, x, 1/3', '-x, x, 2/3'], ['x, 0, 1/2', '0, x, 5/6', '-x, -x, 1/6', '-x, 0, 1/2', '0, -x, 5/6', 'x, x, 1/6'], ['x, 0, 0', '0, x, 1/3', '-x, -x, 2/3', '-x, 0, 0', '0, -x, 1/3', 'x, x, 2/3'], ['1/2, 0, z', '0, 1/2, z+1/3', '1/2, 1/2, z+2/3', '0, 1/2, -z+1/3', '1/2, 0, -z', '1/2, 1/2, -z+2/3'], ['0, 0, z', '0, 0, z+1/3', '0, 0, z+2/3', '0, 0, -z+1/3', '0, 0, -z', '0, 0, -z+2/3'], ['1/2, 0, 1/2', '0, 1/2, 5/6', '1/2, 1/2, 1/6'], ['1/2, 0, 0', '0, 1/2, 1/3', '1/2, 1/2, 2/3'], ['0, 0, 1/2', '0, 0, 5/6', '0, 0, 1/6'], ['0, 0, 0', '0, 0, 1/3', '0, 0, 2/3']]" +182,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', '-y, -x, -z+1/2', '-x+y, y, -z+1/2', 'x, x-y, -z+1/2'], ['x, 2x, 1/4', '-2x, -x, 1/4', 'x, -x, 1/4', '-x, -2x, 3/4', '2x, x, 3/4', '-x, x, 3/4'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', '-x, 0, 1/2', '0, -x, 1/2', 'x, x, 1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2', '2/3, 1/3, -z', '1/3, 2/3, -z+1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z', '0, 0, -z+1/2'], ['1/3, 2/3, 3/4', '2/3, 1/3, 1/4'], ['1/3, 2/3, 1/4', '2/3, 1/3, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 0, 0', '0, 0, 1/2']]" +183,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z', '-x, x, z', '-x, -2x, z', '2x, x, z'], ['x, 0, z', '0, x, z', '-x, -x, z', '-x, 0, z', '0, -x, z', 'x, x, z'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z'], ['1/3, 2/3, z', '2/3, 1/3, z'], ['0, 0, z']]" +184,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z', '0, 1/2, z+1/2', '1/2, 0, z+1/2', '1/2, 1/2, z+1/2'], ['1/3, 2/3, z', '2/3, 1/3, z', '1/3, 2/3, z+1/2', '2/3, 1/3, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +185,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, 0, z', '0, x, z', '-x, -x, z', '-x, 0, z+1/2', '0, -x, z+1/2', 'x, x, z+1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2', '1/3, 2/3, z+1/2', '2/3, 1/3, z'], ['0, 0, z', '0, 0, z+1/2']]" +186,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z', '-x, x, z+1/2', '-x, -2x, z+1/2', '2x, x, z+1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2'], ['0, 0, z', '0, 0, z+1/2']]" +187,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'x, y, -z', '-y, x-y, -z', '-x+y, -x, -z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z'], ['x, -x, z', 'x, 2x, z', '-2x, -x, z', 'x, -x, -z', 'x, 2x, -z', '-2x, -x, -z'], ['x, y, 1/2', '-y, x-y, 1/2', '-x+y, -x, 1/2', '-y, -x, 1/2', '-x+y, y, 1/2', 'x, x-y, 1/2'], ['x, y, 0', '-y, x-y, 0', '-x+y, -x, 0', '-y, -x, 0', '-x+y, y, 0', 'x, x-y, 0'], ['x, -x, 1/2', 'x, 2x, 1/2', '-2x, -x, 1/2'], ['x, -x, 0', 'x, 2x, 0', '-2x, -x, 0'], ['2/3, 1/3, z', '2/3, 1/3, -z'], ['1/3, 2/3, z', '1/3, 2/3, -z'], ['0, 0, z', '0, 0, -z'], ['2/3, 1/3, 1/2'], ['2/3, 1/3, 0'], ['1/3, 2/3, 1/2'], ['1/3, 2/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +188,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'x, y, -z+1/2', '-y, x-y, -z+1/2', '-x+y, -x, -z+1/2', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z'], ['x, y, 1/4', '-y, x-y, 1/4', '-x+y, -x, 1/4', '-y, -x, 3/4', '-x+y, y, 3/4', 'x, x-y, 3/4'], ['x, -x, 0', 'x, 2x, 0', '-2x, -x, 0', 'x, -x, 1/2', 'x, 2x, 1/2', '-2x, -x, 1/2'], ['2/3, 1/3, z', '2/3, 1/3, -z+1/2', '2/3, 1/3, z+1/2', '2/3, 1/3, -z'], ['1/3, 2/3, z', '1/3, 2/3, -z+1/2', '1/3, 2/3, z+1/2', '1/3, 2/3, -z'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, z+1/2', '0, 0, -z'], ['2/3, 1/3, 1/4', '2/3, 1/3, 3/4'], ['2/3, 1/3, 0', '2/3, 1/3, 1/2'], ['1/3, 2/3, 1/4', '1/3, 2/3, 3/4'], ['1/3, 2/3, 0', '1/3, 2/3, 1/2'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 0, 0', '0, 0, 1/2']]" +189,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'x, y, -z', '-y, x-y, -z', '-x+y, -x, -z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, y, 1/2', '-y, x-y, 1/2', '-x+y, -x, 1/2', 'y, x, 1/2', 'x-y, -y, 1/2', '-x, -x+y, 1/2'], ['x, y, 0', '-y, x-y, 0', '-x+y, -x, 0', 'y, x, 0', 'x-y, -y, 0', '-x, -x+y, 0'], ['x, 0, z', '0, x, z', '-x, -x, z', 'x, 0, -z', '0, x, -z', '-x, -x, -z'], ['1/3, 2/3, z', '1/3, 2/3, -z', '2/3, 1/3, -z', '2/3, 1/3, z'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2'], ['x, 0, 0', '0, x, 0', '-x, -x, 0'], ['0, 0, z', '0, 0, -z'], ['1/3, 2/3, 1/2', '2/3, 1/3, 1/2'], ['1/3, 2/3, 0', '2/3, 1/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +190,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', 'x, y, -z+1/2', '-y, x-y, -z+1/2', '-x+y, -x, -z+1/2', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['x, y, 1/4', '-y, x-y, 1/4', '-x+y, -x, 1/4', 'y, x, 3/4', 'x-y, -y, 3/4', '-x, -x+y, 3/4'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', 'x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2'], ['1/3, 2/3, z', '1/3, 2/3, -z+1/2', '2/3, 1/3, -z', '2/3, 1/3, z+1/2'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2'], ['2/3, 1/3, 1/4', '1/3, 2/3, 3/4'], ['1/3, 2/3, 1/4', '2/3, 1/3, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 0, 0', '0, 0, 1/2']]" +191,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x, y, -z', '-y, x-y, -z', '-x+y, -x, -z', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, y, 1/2', '-y, x-y, 1/2', '-x+y, -x, 1/2', '-x, -y, 1/2', 'y, -x+y, 1/2', 'x-y, x, 1/2', 'y, x, 1/2', 'x-y, -y, 1/2', '-x, -x+y, 1/2', '-y, -x, 1/2', '-x+y, y, 1/2', 'x, x-y, 1/2'], ['x, y, 0', '-y, x-y, 0', '-x+y, -x, 0', '-x, -y, 0', 'y, -x+y, 0', 'x-y, x, 0', 'y, x, 0', 'x-y, -y, 0', '-x, -x+y, 0', '-y, -x, 0', '-x+y, y, 0', 'x, x-y, 0'], ['x, 2x, z', '-2x, -x, z', 'x, -x, z', '-x, -2x, z', '2x, x, z', '-x, x, z', '2x, x, -z', '-x, -2x, -z', '-x, x, -z', '-2x, -x, -z', 'x, 2x, -z', 'x, -x, -z'], ['x, 0, z', '0, x, z', '-x, -x, z', '-x, 0, z', '0, -x, z', 'x, x, z', '0, x, -z', 'x, 0, -z', '-x, -x, -z', '0, -x, -z', '-x, 0, -z', 'x, x, -z'], ['x, 2x, 1/2', '-2x, -x, 1/2', 'x, -x, 1/2', '-x, -2x, 1/2', '2x, x, 1/2', '-x, x, 1/2'], ['x, 2x, 0', '-2x, -x, 0', 'x, -x, 0', '-x, -2x, 0', '2x, x, 0', '-x, x, 0'], ['x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2', '-x, 0, 1/2', '0, -x, 1/2', 'x, x, 1/2'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', '-x, 0, 0', '0, -x, 0', 'x, x, 0'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z', '0, 1/2, -z', '1/2, 0, -z', '1/2, 1/2, -z'], ['1/3, 2/3, z', '2/3, 1/3, z', '2/3, 1/3, -z', '1/3, 2/3, -z'], ['1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0'], ['0, 0, z', '0, 0, -z'], ['1/3, 2/3, 1/2', '2/3, 1/3, 1/2'], ['1/3, 2/3, 0', '2/3, 1/3, 0'], ['0, 0, 1/2'], ['0, 0, 0']]" +192,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z', 'y, -x+y, z', 'x-y, x, z', 'y, x, -z+1/2', 'x-y, -y, -z+1/2', '-x, -x+y, -z+1/2', '-y, -x, -z+1/2', '-x+y, y, -z+1/2', 'x, x-y, -z+1/2', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x, y, -z', '-y, x-y, -z', '-x+y, -x, -z', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['x, y, 0', '-y, x-y, 0', '-x+y, -x, 0', '-x, -y, 0', 'y, -x+y, 0', 'x-y, x, 0', 'y, x, 1/2', 'x-y, -y, 1/2', '-x, -x+y, 1/2', '-y, -x, 1/2', '-x+y, y, 1/2', 'x, x-y, 1/2'], ['x, 2x, 1/4', '-2x, -x, 1/4', 'x, -x, 1/4', '-x, -2x, 1/4', '2x, x, 1/4', '-x, x, 1/4', '-x, -2x, 3/4', '2x, x, 3/4', '-x, x, 3/4', 'x, 2x, 3/4', '-2x, -x, 3/4', 'x, -x, 3/4'], ['x, 0, 1/4', '0, x, 1/4', '-x, -x, 1/4', '-x, 0, 1/4', '0, -x, 1/4', 'x, x, 1/4', '-x, 0, 3/4', '0, -x, 3/4', 'x, x, 3/4', 'x, 0, 3/4', '0, x, 3/4', '-x, -x, 3/4'], ['1/2, 0, z', '0, 1/2, z', '1/2, 1/2, z', '0, 1/2, -z+1/2', '1/2, 0, -z+1/2', '1/2, 1/2, -z+1/2', '1/2, 0, -z', '0, 1/2, -z', '1/2, 1/2, -z', '0, 1/2, z+1/2', '1/2, 0, z+1/2', '1/2, 1/2, z+1/2'], ['1/3, 2/3, z', '2/3, 1/3, z', '2/3, 1/3, -z+1/2', '1/3, 2/3, -z+1/2', '2/3, 1/3, -z', '1/3, 2/3, -z', '1/3, 2/3, z+1/2', '2/3, 1/3, z+1/2'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 1/2'], ['1/2, 0, 1/4', '0, 1/2, 1/4', '1/2, 1/2, 1/4', '1/2, 0, 3/4', '0, 1/2, 3/4', '1/2, 1/2, 3/4'], ['0, 0, z', '0, 0, -z+1/2', '0, 0, -z', '0, 0, z+1/2'], ['1/3, 2/3, 0', '2/3, 1/3, 0', '2/3, 1/3, 1/2', '1/3, 2/3, 1/2'], ['1/3, 2/3, 1/4', '2/3, 1/3, 1/4', '2/3, 1/3, 3/4', '1/3, 2/3, 3/4'], ['0, 0, 0', '0, 0, 1/2'], ['0, 0, 1/4', '0, 0, 3/4']]" +193,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2', 'y, x, -z+1/2', 'x-y, -y, -z+1/2', '-x, -x+y, -z+1/2', '-y, -x, -z', '-x+y, y, -z', 'x, x-y, -z', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x, y, -z+1/2', '-y, x-y, -z+1/2', '-x+y, -x, -z+1/2', '-y, -x, z+1/2', '-x+y, y, z+1/2', 'x, x-y, z+1/2', 'y, x, z', 'x-y, -y, z', '-x, -x+y, z'], ['x, 0, z', '0, x, z', '-x, -x, z', '-x, 0, z+1/2', '0, -x, z+1/2', 'x, x, z+1/2', '0, x, -z+1/2', 'x, 0, -z+1/2', '-x, -x, -z+1/2', '0, -x, -z', '-x, 0, -z', 'x, x, -z'], ['x, y, 1/4', '-y, x-y, 1/4', '-x+y, -x, 1/4', '-x, -y, 3/4', 'y, -x+y, 3/4', 'x-y, x, 3/4', 'y, x, 1/4', 'x-y, -y, 1/4', '-x, -x+y, 1/4', '-y, -x, 3/4', '-x+y, y, 3/4', 'x, x-y, 3/4'], ['x, 2x, 0', '-2x, -x, 0', 'x, -x, 0', '-x, -2x, 1/2', '2x, x, 1/2', '-x, x, 1/2', '-x, -2x, 0', '2x, x, 0', '-x, x, 0', 'x, 2x, 1/2', '-2x, -x, 1/2', 'x, -x, 1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2', '2/3, 1/3, -z+1/2', '1/3, 2/3, -z', '2/3, 1/3, -z', '1/3, 2/3, -z+1/2', '1/3, 2/3, z+1/2', '2/3, 1/3, z'], ['x, 0, 1/4', '0, x, 1/4', '-x, -x, 1/4', '-x, 0, 3/4', '0, -x, 3/4', 'x, x, 3/4'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z+1/2', '0, 0, -z'], ['1/3, 2/3, 0', '2/3, 1/3, 1/2', '2/3, 1/3, 0', '1/3, 2/3, 1/2'], ['1/3, 2/3, 1/4', '2/3, 1/3, 3/4', '2/3, 1/3, 1/4', '1/3, 2/3, 3/4'], ['0, 0, 0', '0, 0, 1/2'], ['0, 0, 1/4', '0, 0, 3/4']]" +194,"[['x, y, z', '-y, x-y, z', '-x+y, -x, z', '-x, -y, z+1/2', 'y, -x+y, z+1/2', 'x-y, x, z+1/2', 'y, x, -z', 'x-y, -y, -z', '-x, -x+y, -z', '-y, -x, -z+1/2', '-x+y, y, -z+1/2', 'x, x-y, -z+1/2', '-x, -y, -z', 'y, -x+y, -z', 'x-y, x, -z', 'x, y, -z+1/2', '-y, x-y, -z+1/2', '-x+y, -x, -z+1/2', '-y, -x, z', '-x+y, y, z', 'x, x-y, z', 'y, x, z+1/2', 'x-y, -y, z+1/2', '-x, -x+y, z+1/2'], ['x, 2x, z', '-2x, -x, z', 'x, -x, z', '-x, -2x, z+1/2', '2x, x, z+1/2', '-x, x, z+1/2', '2x, x, -z', '-x, -2x, -z', '-x, x, -z', '-2x, -x, -z+1/2', 'x, 2x, -z+1/2', 'x, -x, -z+1/2'], ['x, y, 1/4', '-y, x-y, 1/4', '-x+y, -x, 1/4', '-x, -y, 3/4', 'y, -x+y, 3/4', 'x-y, x, 3/4', 'y, x, 3/4', 'x-y, -y, 3/4', '-x, -x+y, 3/4', '-y, -x, 1/4', '-x+y, y, 1/4', 'x, x-y, 1/4'], ['x, 0, 0', '0, x, 0', '-x, -x, 0', '-x, 0, 1/2', '0, -x, 1/2', 'x, x, 1/2', '-x, 0, 0', '0, -x, 0', 'x, x, 0', 'x, 0, 1/2', '0, x, 1/2', '-x, -x, 1/2'], ['x, 2x, 1/4', '-2x, -x, 1/4', 'x, -x, 1/4', '-x, -2x, 3/4', '2x, x, 3/4', '-x, x, 3/4'], ['1/2, 0, 0', '0, 1/2, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 1/2'], ['1/3, 2/3, z', '2/3, 1/3, z+1/2', '2/3, 1/3, -z', '1/3, 2/3, -z+1/2'], ['0, 0, z', '0, 0, z+1/2', '0, 0, -z', '0, 0, -z+1/2'], ['1/3, 2/3, 3/4', '2/3, 1/3, 1/4'], ['1/3, 2/3, 1/4', '2/3, 1/3, 3/4'], ['0, 0, 1/4', '0, 0, 3/4'], ['0, 0, 0', '0, 0, 1/2']]" +195,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x'], ['1/2, 0, 0', '0, 1/2, 0', '0, 0, 1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0'], ['1/2, 1/2, 1/2'], ['0, 0, 0']]" +196,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x'], ['3/4, 3/4, 3/4', '3/4, 5/4, 5/4', '5/4, 3/4, 5/4', '5/4, 5/4, 3/4'], ['1/4, 1/4, 1/4', '1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['1/2, 1/2, 1/2', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +197,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1/2, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y+1/2', '-z+1/2, x+1/2, -y+1/2', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x+1/2'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', 'x+1/2, 1, 1/2', '-x+1/2, 1, 1/2', '1/2, x+1/2, 1', '1/2, -x+1/2, 1', '1, 1/2, x+1/2', '1, 1/2, -x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +198,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x']]" +199,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1, -x+1, -y+1/2', '-z+1, -x+1/2, y+1', '-z+1/2, x+1, -y+1', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1, -x+1', 'y+1, -z+1, -x+1/2', '-y+1, -z+1/2, x+1'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '1/4, x, 0', '3/4, -x+1/2, 0', '0, 1/4, x', '0, 3/4, -x+1/2', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '3/4, x+1/2, 1/2', '5/4, -x+1, 1/2', '1/2, 3/4, x+1/2', '1/2, 5/4, -x+1'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', 'x+1/2, x+1/2, x+1/2', '-x+1, -x+1/2, x+1', '-x+1/2, x+1, -x+1', 'x+1, -x+1, -x+1/2']]" +200,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x'], ['1/2, y, z', '1/2, -y, z', '1/2, y, -z', '1/2, -y, -z', 'z, 1/2, y', 'z, 1/2, -y', '-z, 1/2, y', '-z, 1/2, -y', 'y, z, 1/2', '-y, z, 1/2', 'y, -z, 1/2', '-y, -z, 1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', '-x, -x, -x', 'x, x, -x', 'x, -x, x', '-x, x, x'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x'], ['1/2, 0, 0', '0, 1/2, 0', '0, 0, 1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0'], ['1/2, 1/2, 1/2'], ['0, 0, 0']]" +201,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x+1/2, y, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x, y', 'z, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y', '-z+1/2, x, -y+1/2', 'y, z, x', '-y+1/2, z, -x+1/2', 'y, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y, z+1/2', '-x, y+1/2, z+1/2', '-z, -x, -y', '-z, x+1/2, y+1/2', 'z+1/2, x+1/2, -y', 'z+1/2, -x, y+1/2', '-y, -z, -x', 'y+1/2, -z, x+1/2', '-y, z+1/2, x+1/2', 'y+1/2, z+1/2, -x'], ['x, 3/4, 1/4', '-x+1/2, 3/4, 1/4', '1/4, x, 3/4', '1/4, -x+1/2, 3/4', '3/4, 1/4, x', '3/4, 1/4, -x+1/2', '-x, 1/4, 3/4', 'x+1/2, 1/4, 3/4', '3/4, -x, 1/4', '3/4, x+1/2, 1/4', '1/4, 3/4, -x', '1/4, 3/4, x+1/2'], ['x, 1/4, 1/4', '-x+1/2, 1/4, 1/4', '1/4, x, 1/4', '1/4, -x+1/2, 1/4', '1/4, 1/4, x', '1/4, 1/4, -x+1/2', '-x, 3/4, 3/4', 'x+1/2, 3/4, 3/4', '3/4, -x, 3/4', '3/4, x+1/2, 3/4', '3/4, 3/4, -x', '3/4, 3/4, x+1/2'], ['x, x, x', '-x+1/2, -x+1/2, x', '-x+1/2, x, -x+1/2', 'x, -x+1/2, -x+1/2', '-x, -x, -x', 'x+1/2, x+1/2, -x', 'x+1/2, -x, x+1/2', '-x, x+1/2, x+1/2'], ['1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4', '3/4, 1/4, 1/4', '1/4, 3/4, 1/4', '1/4, 1/4, 3/4'], ['1/2, 1/2, 1/2', '0, 0, 1/2', '0, 1/2, 0', '1/2, 0, 0'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4']]" +202,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', '-x, -y+1/2, -z+1/2', 'x, y+1/2, -z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2', '-z, -x+1/2, -y+1/2', '-z, x+1/2, y+1/2', 'z, x+1/2, -y+1/2', 'z, -x+1/2, y+1/2', '-y, -z+1/2, -x+1/2', 'y, -z+1/2, x+1/2', '-y, z+1/2, x+1/2', 'y, z+1/2, -x+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', '-x+1/2, -y, -z+1/2', 'x+1/2, y, -z+1/2', 'x+1/2, -y, z+1/2', '-x+1/2, y, z+1/2', '-z+1/2, -x, -y+1/2', '-z+1/2, x, y+1/2', 'z+1/2, x, -y+1/2', 'z+1/2, -x, y+1/2', '-y+1/2, -z, -x+1/2', 'y+1/2, -z, x+1/2', '-y+1/2, z, x+1/2', 'y+1/2, z, -x+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-z+1/2, -x+1/2, -y', '-z+1/2, x+1/2, y', 'z+1/2, x+1/2, -y', 'z+1/2, -x+1/2, y', '-y+1/2, -z+1/2, -x', 'y+1/2, -z+1/2, x', '-y+1/2, z+1/2, x', 'y+1/2, z+1/2, -x'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', '0, y+1/2, z+1/2', '0, -y+1/2, z+1/2', '0, y+1/2, -z+1/2', '0, -y+1/2, -z+1/2', 'z, 1/2, y+1/2', 'z, 1/2, -y+1/2', '-z, 1/2, y+1/2', '-z, 1/2, -y+1/2', 'y, z+1/2, 1/2', '-y, z+1/2, 1/2', 'y, -z+1/2, 1/2', '-y, -z+1/2, 1/2', '1/2, y, z+1/2', '1/2, -y, z+1/2', '1/2, y, -z+1/2', '1/2, -y, -z+1/2', 'z+1/2, 0, y+1/2', 'z+1/2, 0, -y+1/2', '-z+1/2, 0, y+1/2', '-z+1/2, 0, -y+1/2', 'y+1/2, z, 1/2', '-y+1/2, z, 1/2', 'y+1/2, -z, 1/2', '-y+1/2, -z, 1/2', '1/2, y+1/2, z', '1/2, -y+1/2, z', '1/2, y+1/2, -z', '1/2, -y+1/2, -z', 'z+1/2, 1/2, y', 'z+1/2, 1/2, -y', '-z+1/2, 1/2, y', '-z+1/2, 1/2, -y', 'y+1/2, z+1/2, 0', '-y+1/2, z+1/2, 0', 'y+1/2, -z+1/2, 0', '-y+1/2, -z+1/2, 0'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', '-x, 3/4, 3/4', 'x, 1/4, 3/4', '3/4, -x, 3/4', '3/4, x, 1/4', '3/4, 3/4, -x', '1/4, 3/4, x', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', '-x, 5/4, 5/4', 'x, 3/4, 5/4', '3/4, -x+1/2, 5/4', '3/4, x+1/2, 3/4', '3/4, 5/4, -x+1/2', '1/4, 5/4, x+1/2', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', '-x+1/2, 3/4, 5/4', 'x+1/2, 1/4, 5/4', '5/4, -x, 5/4', '5/4, x, 3/4', '5/4, 3/4, -x+1/2', '3/4, 3/4, x+1/2', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x', '-x+1/2, 5/4, 3/4', 'x+1/2, 3/4, 3/4', '5/4, -x+1/2, 3/4', '5/4, x+1/2, 1/4', '5/4, 5/4, -x', '3/4, 5/4, x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', '-x, -x, -x', 'x, x, -x', 'x, -x, x', '-x, x, x', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', '-x, -x+1/2, -x+1/2', 'x, x+1/2, -x+1/2', 'x, -x+1/2, x+1/2', '-x, x+1/2, x+1/2', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', '-x+1/2, -x, -x+1/2', 'x+1/2, x, -x+1/2', 'x+1/2, -x, x+1/2', '-x+1/2, x, x+1/2', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x', '-x+1/2, -x+1/2, -x', 'x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, x', '-x+1/2, x+1/2, x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x'], ['0, 1/4, 1/4', '0, 3/4, 1/4', '1/4, 0, 1/4', '1/4, 0, 3/4', '1/4, 1/4, 0', '3/4, 1/4, 0', '0, 3/4, 3/4', '0, 5/4, 3/4', '1/4, 1/2, 3/4', '1/4, 1/2, 5/4', '1/4, 3/4, 1/2', '3/4, 3/4, 1/2', '1/2, 1/4, 3/4', '1/2, 3/4, 3/4', '3/4, 0, 3/4', '3/4, 0, 5/4', '3/4, 1/4, 1/2', '5/4, 1/4, 1/2', '1/2, 3/4, 1/4', '1/2, 5/4, 1/4', '3/4, 1/2, 1/4', '3/4, 1/2, 3/4', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4', '1/4, 3/4, 3/4', '3/4, 5/4, 5/4', '3/4, 1/4, 3/4', '5/4, 3/4, 5/4', '3/4, 3/4, 1/4', '5/4, 5/4, 3/4'], ['1/2, 1/2, 1/2', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +203,"[['x, y, z', '-x+1/4, -y+1/4, z', '-x+1/4, y, -z+1/4', 'x, -y+1/4, -z+1/4', 'z, x, y', 'z, -x+1/4, -y+1/4', '-z+1/4, -x+1/4, y', '-z+1/4, x, -y+1/4', 'y, z, x', '-y+1/4, z, -x+1/4', 'y, -z+1/4, -x+1/4', '-y+1/4, -z+1/4, x', '-x, -y, -z', 'x+3/4, y+3/4, -z', 'x+3/4, -y, z+3/4', '-x, y+3/4, z+3/4', '-z, -x, -y', '-z, x+3/4, y+3/4', 'z+3/4, x+3/4, -y', 'z+3/4, -x, y+3/4', '-y, -z, -x', 'y+3/4, -z, x+3/4', '-y, z+3/4, x+3/4', 'y+3/4, z+3/4, -x', 'x, y+1/2, z+1/2', '-x+1/4, -y+3/4, z+1/2', '-x+1/4, y+1/2, -z+3/4', 'x, -y+3/4, -z+3/4', 'z, x+1/2, y+1/2', 'z, -x+3/4, -y+3/4', '-z+1/4, -x+3/4, y+1/2', '-z+1/4, x+1/2, -y+3/4', 'y, z+1/2, x+1/2', '-y+1/4, z+1/2, -x+3/4', 'y, -z+3/4, -x+3/4', '-y+1/4, -z+3/4, x+1/2', '-x, -y+1/2, -z+1/2', 'x+3/4, y+5/4, -z+1/2', 'x+3/4, -y+1/2, z+5/4', '-x, y+5/4, z+5/4', '-z, -x+1/2, -y+1/2', '-z, x+5/4, y+5/4', 'z+3/4, x+5/4, -y+1/2', 'z+3/4, -x+1/2, y+5/4', '-y, -z+1/2, -x+1/2', 'y+3/4, -z+1/2, x+5/4', '-y, z+5/4, x+5/4', 'y+3/4, z+5/4, -x+1/2', 'x+1/2, y, z+1/2', '-x+3/4, -y+1/4, z+1/2', '-x+3/4, y, -z+3/4', 'x+1/2, -y+1/4, -z+3/4', 'z+1/2, x, y+1/2', 'z+1/2, -x+1/4, -y+3/4', '-z+3/4, -x+1/4, y+1/2', '-z+3/4, x, -y+3/4', 'y+1/2, z, x+1/2', '-y+3/4, z, -x+3/4', 'y+1/2, -z+1/4, -x+3/4', '-y+3/4, -z+1/4, x+1/2', '-x+1/2, -y, -z+1/2', 'x+5/4, y+3/4, -z+1/2', 'x+5/4, -y, z+5/4', '-x+1/2, y+3/4, z+5/4', '-z+1/2, -x, -y+1/2', '-z+1/2, x+3/4, y+5/4', 'z+5/4, x+3/4, -y+1/2', 'z+5/4, -x, y+5/4', '-y+1/2, -z, -x+1/2', 'y+5/4, -z, x+5/4', '-y+1/2, z+3/4, x+5/4', 'y+5/4, z+3/4, -x+1/2', 'x+1/2, y+1/2, z', '-x+3/4, -y+3/4, z', '-x+3/4, y+1/2, -z+1/4', 'x+1/2, -y+3/4, -z+1/4', 'z+1/2, x+1/2, y', 'z+1/2, -x+3/4, -y+1/4', '-z+3/4, -x+3/4, y', '-z+3/4, x+1/2, -y+1/4', 'y+1/2, z+1/2, x', '-y+3/4, z+1/2, -x+1/4', 'y+1/2, -z+3/4, -x+1/4', '-y+3/4, -z+3/4, x', '-x+1/2, -y+1/2, -z', 'x+5/4, y+5/4, -z', 'x+5/4, -y+1/2, z+3/4', '-x+1/2, y+5/4, z+3/4', '-z+1/2, -x+1/2, -y', '-z+1/2, x+5/4, y+3/4', 'z+5/4, x+5/4, -y', 'z+5/4, -x+1/2, y+3/4', '-y+1/2, -z+1/2, -x', 'y+5/4, -z+1/2, x+3/4', '-y+1/2, z+5/4, x+3/4', 'y+5/4, z+5/4, -x'], ['x, 1/8, 1/8', '-x+1/4, 1/8, 1/8', '1/8, x, 1/8', '1/8, -x+1/4, 1/8', '1/8, 1/8, x', '1/8, 1/8, -x+1/4', '-x, 7/8, 7/8', 'x+3/4, 7/8, 7/8', '7/8, -x, 7/8', '7/8, x+3/4, 7/8', '7/8, 7/8, -x', '7/8, 7/8, x+3/4', 'x, 5/8, 5/8', '-x+1/4, 5/8, 5/8', '1/8, x+1/2, 5/8', '1/8, -x+3/4, 5/8', '1/8, 5/8, x+1/2', '1/8, 5/8, -x+3/4', '-x, 11/8, 11/8', 'x+3/4, 11/8, 11/8', '7/8, -x+1/2, 11/8', '7/8, x+5/4, 11/8', '7/8, 11/8, -x+1/2', '7/8, 11/8, x+5/4', 'x+1/2, 1/8, 5/8', '-x+3/4, 1/8, 5/8', '5/8, x, 5/8', '5/8, -x+1/4, 5/8', '5/8, 1/8, x+1/2', '5/8, 1/8, -x+3/4', '-x+1/2, 7/8, 11/8', 'x+5/4, 7/8, 11/8', '11/8, -x, 11/8', '11/8, x+3/4, 11/8', '11/8, 7/8, -x+1/2', '11/8, 7/8, x+5/4', 'x+1/2, 5/8, 1/8', '-x+3/4, 5/8, 1/8', '5/8, x+1/2, 1/8', '5/8, -x+3/4, 1/8', '5/8, 5/8, x', '5/8, 5/8, -x+1/4', '-x+1/2, 11/8, 7/8', 'x+5/4, 11/8, 7/8', '11/8, -x+1/2, 7/8', '11/8, x+5/4, 7/8', '11/8, 11/8, -x', '11/8, 11/8, x+3/4'], ['x, x, x', '-x+1/4, -x+1/4, x', '-x+1/4, x, -x+1/4', 'x, -x+1/4, -x+1/4', '-x, -x, -x', 'x+3/4, x+3/4, -x', 'x+3/4, -x, x+3/4', '-x, x+3/4, x+3/4', 'x, x+1/2, x+1/2', '-x+1/4, -x+3/4, x+1/2', '-x+1/4, x+1/2, -x+3/4', 'x, -x+3/4, -x+3/4', '-x, -x+1/2, -x+1/2', 'x+3/4, x+5/4, -x+1/2', 'x+3/4, -x+1/2, x+5/4', '-x, x+5/4, x+5/4', 'x+1/2, x, x+1/2', '-x+3/4, -x+1/4, x+1/2', '-x+3/4, x, -x+3/4', 'x+1/2, -x+1/4, -x+3/4', '-x+1/2, -x, -x+1/2', 'x+5/4, x+3/4, -x+1/2', 'x+5/4, -x, x+5/4', '-x+1/2, x+3/4, x+5/4', 'x+1/2, x+1/2, x', '-x+3/4, -x+3/4, x', '-x+3/4, x+1/2, -x+1/4', 'x+1/2, -x+3/4, -x+1/4', '-x+1/2, -x+1/2, -x', 'x+5/4, x+5/4, -x', 'x+5/4, -x+1/2, x+3/4', '-x+1/2, x+5/4, x+3/4'], ['1/2, 1/2, 1/2', '3/4, 3/4, 1/2', '3/4, 1/2, 3/4', '1/2, 3/4, 3/4', '1/2, 1, 1', '3/4, 5/4, 1', '3/4, 1, 5/4', '1/2, 5/4, 5/4', '1, 1/2, 1', '5/4, 3/4, 1', '5/4, 1/2, 5/4', '1, 3/4, 5/4', '1, 1, 1/2', '5/4, 5/4, 1/2', '5/4, 1, 3/4', '1, 5/4, 3/4'], ['0, 0, 0', '1/4, 1/4, 0', '1/4, 0, 1/4', '0, 1/4, 1/4', '0, 1/2, 1/2', '1/4, 3/4, 1/2', '1/4, 1/2, 3/4', '0, 3/4, 3/4', '1/2, 0, 1/2', '3/4, 1/4, 1/2', '3/4, 0, 3/4', '1/2, 1/4, 3/4', '1/2, 1/2, 0', '3/4, 3/4, 0', '3/4, 1/2, 1/4', '1/2, 3/4, 1/4'], ['5/8, 5/8, 5/8', '3/8, 3/8, 3/8', '5/8, 9/8, 9/8', '3/8, 7/8, 7/8', '9/8, 5/8, 9/8', '7/8, 3/8, 7/8', '9/8, 9/8, 5/8', '7/8, 7/8, 3/8'], ['1/8, 1/8, 1/8', '7/8, 7/8, 7/8', '1/8, 5/8, 5/8', '7/8, 11/8, 11/8', '5/8, 1/8, 5/8', '11/8, 7/8, 11/8', '5/8, 5/8, 1/8', '11/8, 11/8, 7/8']]" +204,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1/2, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y+1/2', '-z+1/2, x+1/2, -y+1/2', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-z+1/2, -x+1/2, -y+1/2', '-z+1/2, x+1/2, y+1/2', 'z+1/2, x+1/2, -y+1/2', 'z+1/2, -x+1/2, y+1/2', '-y+1/2, -z+1/2, -x+1/2', 'y+1/2, -z+1/2, x+1/2', '-y+1/2, z+1/2, x+1/2', 'y+1/2, z+1/2, -x+1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', '1/2, y+1/2, z+1/2', '1/2, -y+1/2, z+1/2', '1/2, y+1/2, -z+1/2', '1/2, -y+1/2, -z+1/2', 'z+1/2, 1/2, y+1/2', 'z+1/2, 1/2, -y+1/2', '-z+1/2, 1/2, y+1/2', '-z+1/2, 1/2, -y+1/2', 'y+1/2, z+1/2, 1/2', '-y+1/2, z+1/2, 1/2', 'y+1/2, -z+1/2, 1/2', '-y+1/2, -z+1/2, 1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', '-x, -x, -x', 'x, x, -x', 'x, -x, x', '-x, x, x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, x+1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1', '1, x+1/2, 1/2', '1, -x+1/2, 1/2', '1/2, 1, x+1/2', '1/2, 1, -x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '1/4, 3/4, 3/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 5/4', '3/4, 5/4, 5/4'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +205,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x, -y+1/2, z+1/2', '-x+1/2, y+1/2, z', '-z, -x, -y', '-z+1/2, x+1/2, y', 'z+1/2, x, -y+1/2', 'z, -x+1/2, y+1/2', '-y, -z, -x', 'y, -z+1/2, x+1/2', '-y+1/2, z+1/2, x', 'y+1/2, z, -x+1/2'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', '-x, -x, -x', 'x+1/2, x, -x+1/2', 'x, -x+1/2, x+1/2', '-x+1/2, x+1/2, x'], ['1/2, 1/2, 1/2', '0, 1/2, 0', '1/2, 0, 0', '0, 0, 1/2'], ['0, 0, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 0']]" +206,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x, -y+1/2, z+1/2', '-x+1/2, y+1/2, z', '-z, -x, -y', '-z+1/2, x+1/2, y', 'z+1/2, x, -y+1/2', 'z, -x+1/2, y+1/2', '-y, -z, -x', 'y, -z+1/2, x+1/2', '-y+1/2, z+1/2, x', 'y+1/2, z, -x+1/2', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1, -x+1, -y+1/2', '-z+1, -x+1/2, y+1', '-z+1/2, x+1, -y+1', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1, -x+1', 'y+1, -z+1, -x+1/2', '-y+1, -z+1/2, x+1', '-x+1/2, -y+1/2, -z+1/2', 'x+1, y+1/2, -z+1', 'x+1/2, -y+1, z+1', '-x+1, y+1, z+1/2', '-z+1/2, -x+1/2, -y+1/2', '-z+1, x+1, y+1/2', 'z+1, x+1/2, -y+1', 'z+1/2, -x+1, y+1', '-y+1/2, -z+1/2, -x+1/2', 'y+1/2, -z+1, x+1', '-y+1, z+1, x+1/2', 'y+1, z+1/2, -x+1'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '1/4, x, 0', '3/4, -x+1/2, 0', '0, 1/4, x', '0, 3/4, -x+1/2', '-x, 0, 3/4', 'x+1/2, 0, 1/4', '3/4, -x, 0', '1/4, x+1/2, 0', '0, 3/4, -x', '0, 1/4, x+1/2', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '3/4, x+1/2, 1/2', '5/4, -x+1, 1/2', '1/2, 3/4, x+1/2', '1/2, 5/4, -x+1', '-x+1/2, 1/2, 5/4', 'x+1, 1/2, 3/4', '5/4, -x+1/2, 1/2', '3/4, x+1, 1/2', '1/2, 5/4, -x+1/2', '1/2, 3/4, x+1'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', '-x, -x, -x', 'x+1/2, x, -x+1/2', 'x, -x+1/2, x+1/2', '-x+1/2, x+1/2, x', 'x+1/2, x+1/2, x+1/2', '-x+1, -x+1/2, x+1', '-x+1/2, x+1, -x+1', 'x+1, -x+1, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1, x+1/2, -x+1', 'x+1/2, -x+1, x+1', '-x+1, x+1, x+1/2'], ['1/4, 1/4, 1/4', '1/4, 3/4, 3/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '3/4, 3/4, 3/4', '3/4, 5/4, 5/4', '5/4, 5/4, 3/4', '5/4, 3/4, 5/4'], ['0, 0, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 0', '1/2, 1/2, 1/2', '1, 1/2, 1', '1/2, 1, 1', '1, 1, 1/2']]" +207,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, -z', '-y, -x, -z', 'y, -x, z', '-y, x, z', 'x, z, -y', '-x, z, y', '-x, -z, -y', 'x, -z, y', 'z, y, -x', 'z, -y, x', '-z, y, x', '-z, -y, -x'], ['1/2, y, y', '1/2, -y, y', '1/2, y, -y', '1/2, -y, -y', 'y, 1/2, y', 'y, 1/2, -y', '-y, 1/2, y', '-y, 1/2, -y', 'y, y, 1/2', '-y, y, 1/2', 'y, -y, 1/2', '-y, -y, 1/2'], ['0, y, y', '0, -y, y', '0, y, -y', '0, -y, -y', 'y, 0, y', 'y, 0, -y', '-y, 0, y', '-y, 0, -y', 'y, y, 0', '-y, y, 0', 'y, -y, 0', '-y, -y, 0'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '1/2, x, 0', '1/2, -x, 0', 'x, 0, 1/2', '-x, 0, 1/2', '0, 1/2, -x', '0, 1/2, x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x, -x', '-x, -x, -x', 'x, -x, x', '-x, x, x'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x'], ['1/2, 0, 0', '0, 1/2, 0', '0, 0, 1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0'], ['1/2, 1/2, 1/2'], ['0, 0, 0']]" +208,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', 'y+1/2, -x+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'x+1/2, z+1/2, -y+1/2', '-x+1/2, z+1/2, y+1/2', '-x+1/2, -z+1/2, -y+1/2', 'x+1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, x+1/2', '-z+1/2, -y+1/2, -x+1/2'], ['1/4, y, y+1/2', '3/4, -y, y+1/2', '3/4, y, -y+1/2', '1/4, -y, -y+1/2', 'y+1/2, 1/4, y', 'y+1/2, 3/4, -y', '-y+1/2, 3/4, y', '-y+1/2, 1/4, -y', 'y, y+1/2, 1/4', '-y, y+1/2, 3/4', 'y, -y+1/2, 3/4', '-y, -y+1/2, 1/4'], ['1/4, y, -y+1/2', '3/4, -y, -y+1/2', '3/4, y, y+1/2', '1/4, -y, y+1/2', '-y+1/2, 1/4, y', '-y+1/2, 3/4, -y', 'y+1/2, 3/4, y', 'y+1/2, 1/4, -y', 'y, -y+1/2, 1/4', '-y, -y+1/2, 3/4', 'y, y+1/2, 3/4', '-y, y+1/2, 1/4'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, 0, -x+1/2', '1/2, 0, x+1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '0, 1/2, -x+1/2', '0, 1/2, x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, 1/2, -x+1/2', '1/2, 1/2, x+1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, x+1/2'], ['1/4, 1/2, 0', '3/4, 1/2, 0', '0, 1/4, 1/2', '0, 3/4, 1/2', '1/2, 0, 1/4', '1/2, 0, 3/4'], ['1/4, 0, 1/2', '3/4, 0, 1/2', '1/2, 1/4, 0', '1/2, 3/4, 0', '0, 1/2, 1/4', '0, 1/2, 3/4'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '0, 1/2, 0', '1/2, 0, 0', '0, 0, 1/2'], ['3/4, 3/4, 3/4', '1/4, 1/4, 3/4', '1/4, 3/4, 1/4', '3/4, 1/4, 1/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '1/4, 3/4, 3/4'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +209,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, -z', '-y, -x, -z', 'y, -x, z', '-y, x, z', 'x, z, -y', '-x, z, y', '-x, -z, -y', 'x, -z, y', 'z, y, -x', 'z, -y, x', '-z, y, x', '-z, -y, -x', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', 'y, x+1/2, -z+1/2', '-y, -x+1/2, -z+1/2', 'y, -x+1/2, z+1/2', '-y, x+1/2, z+1/2', 'x, z+1/2, -y+1/2', '-x, z+1/2, y+1/2', '-x, -z+1/2, -y+1/2', 'x, -z+1/2, y+1/2', 'z, y+1/2, -x+1/2', 'z, -y+1/2, x+1/2', '-z, y+1/2, x+1/2', '-z, -y+1/2, -x+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', 'y+1/2, x, -z+1/2', '-y+1/2, -x, -z+1/2', 'y+1/2, -x, z+1/2', '-y+1/2, x, z+1/2', 'x+1/2, z, -y+1/2', '-x+1/2, z, y+1/2', '-x+1/2, -z, -y+1/2', 'x+1/2, -z, y+1/2', 'z+1/2, y, -x+1/2', 'z+1/2, -y, x+1/2', '-z+1/2, y, x+1/2', '-z+1/2, -y, -x+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x', 'y+1/2, x+1/2, -z', '-y+1/2, -x+1/2, -z', 'y+1/2, -x+1/2, z', '-y+1/2, x+1/2, z', 'x+1/2, z+1/2, -y', '-x+1/2, z+1/2, y', '-x+1/2, -z+1/2, -y', 'x+1/2, -z+1/2, y', 'z+1/2, y+1/2, -x', 'z+1/2, -y+1/2, x', '-z+1/2, y+1/2, x', '-z+1/2, -y+1/2, -x'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', '1/4, x, 3/4', '3/4, -x, 3/4', 'x, 1/4, 3/4', '-x, 1/4, 1/4', '1/4, 1/4, -x', '1/4, 3/4, x', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', '1/4, x+1/2, 5/4', '3/4, -x+1/2, 5/4', 'x, 3/4, 5/4', '-x, 3/4, 3/4', '1/4, 3/4, -x+1/2', '1/4, 5/4, x+1/2', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', '3/4, x, 5/4', '5/4, -x, 5/4', 'x+1/2, 1/4, 5/4', '-x+1/2, 1/4, 3/4', '3/4, 1/4, -x+1/2', '3/4, 3/4, x+1/2', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x', '3/4, x+1/2, 3/4', '5/4, -x+1/2, 3/4', 'x+1/2, 3/4, 3/4', '-x+1/2, 3/4, 1/4', '3/4, 3/4, -x', '3/4, 5/4, x'], ['1/2, y, y', '1/2, -y, y', '1/2, y, -y', '1/2, -y, -y', 'y, 1/2, y', 'y, 1/2, -y', '-y, 1/2, y', '-y, 1/2, -y', 'y, y, 1/2', '-y, y, 1/2', 'y, -y, 1/2', '-y, -y, 1/2', '1/2, y+1/2, y+1/2', '1/2, -y+1/2, y+1/2', '1/2, y+1/2, -y+1/2', '1/2, -y+1/2, -y+1/2', 'y, 1, y+1/2', 'y, 1, -y+1/2', '-y, 1, y+1/2', '-y, 1, -y+1/2', 'y, y+1/2, 1', '-y, y+1/2, 1', 'y, -y+1/2, 1', '-y, -y+1/2, 1', '1, y, y+1/2', '1, -y, y+1/2', '1, y, -y+1/2', '1, -y, -y+1/2', 'y+1/2, 1/2, y+1/2', 'y+1/2, 1/2, -y+1/2', '-y+1/2, 1/2, y+1/2', '-y+1/2, 1/2, -y+1/2', 'y+1/2, y, 1', '-y+1/2, y, 1', 'y+1/2, -y, 1', '-y+1/2, -y, 1', '1, y+1/2, y', '1, -y+1/2, y', '1, y+1/2, -y', '1, -y+1/2, -y', 'y+1/2, 1, y', 'y+1/2, 1, -y', '-y+1/2, 1, y', '-y+1/2, 1, -y', 'y+1/2, y+1/2, 1/2', '-y+1/2, y+1/2, 1/2', 'y+1/2, -y+1/2, 1/2', '-y+1/2, -y+1/2, 1/2'], ['0, y, y', '0, -y, y', '0, y, -y', '0, -y, -y', 'y, 0, y', 'y, 0, -y', '-y, 0, y', '-y, 0, -y', 'y, y, 0', '-y, y, 0', 'y, -y, 0', '-y, -y, 0', '0, y+1/2, y+1/2', '0, -y+1/2, y+1/2', '0, y+1/2, -y+1/2', '0, -y+1/2, -y+1/2', 'y, 1/2, y+1/2', 'y, 1/2, -y+1/2', '-y, 1/2, y+1/2', '-y, 1/2, -y+1/2', 'y, y+1/2, 1/2', '-y, y+1/2, 1/2', 'y, -y+1/2, 1/2', '-y, -y+1/2, 1/2', '1/2, y, y+1/2', '1/2, -y, y+1/2', '1/2, y, -y+1/2', '1/2, -y, -y+1/2', 'y+1/2, 0, y+1/2', 'y+1/2, 0, -y+1/2', '-y+1/2, 0, y+1/2', '-y+1/2, 0, -y+1/2', 'y+1/2, y, 1/2', '-y+1/2, y, 1/2', 'y+1/2, -y, 1/2', '-y+1/2, -y, 1/2', '1/2, y+1/2, y', '1/2, -y+1/2, y', '1/2, y+1/2, -y', '1/2, -y+1/2, -y', 'y+1/2, 1/2, y', 'y+1/2, 1/2, -y', '-y+1/2, 1/2, y', '-y+1/2, 1/2, -y', 'y+1/2, y+1/2, 0', '-y+1/2, y+1/2, 0', 'y+1/2, -y+1/2, 0', '-y+1/2, -y+1/2, 0'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x, -x', '-x, -x, -x', 'x, -x, x', '-x, x, x', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', 'x, x+1/2, -x+1/2', '-x, -x+1/2, -x+1/2', 'x, -x+1/2, x+1/2', '-x, x+1/2, x+1/2', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', 'x+1/2, x, -x+1/2', '-x+1/2, -x, -x+1/2', 'x+1/2, -x, x+1/2', '-x+1/2, x, x+1/2', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x', 'x+1/2, x+1/2, -x', '-x+1/2, -x+1/2, -x', 'x+1/2, -x+1/2, x', '-x+1/2, x+1/2, x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x'], ['0, 1/4, 1/4', '0, 3/4, 1/4', '1/4, 0, 1/4', '1/4, 0, 3/4', '1/4, 1/4, 0', '3/4, 1/4, 0', '0, 3/4, 3/4', '0, 5/4, 3/4', '1/4, 1/2, 3/4', '1/4, 1/2, 5/4', '1/4, 3/4, 1/2', '3/4, 3/4, 1/2', '1/2, 1/4, 3/4', '1/2, 3/4, 3/4', '3/4, 0, 3/4', '3/4, 0, 5/4', '3/4, 1/4, 1/2', '5/4, 1/4, 1/2', '1/2, 3/4, 1/4', '1/2, 5/4, 1/4', '3/4, 1/2, 1/4', '3/4, 1/2, 3/4', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['1/4, 1/4, 1/4', '1/4, 1/4, 3/4', '1/4, 3/4, 3/4', '1/4, 3/4, 5/4', '3/4, 1/4, 3/4', '3/4, 1/4, 5/4', '3/4, 3/4, 1/4', '3/4, 3/4, 3/4'], ['1/2, 1/2, 1/2', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +210,"[['x, y, z', '-x, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z', 'x+1/2, -y, -z+1/2', 'z, x, y', 'z+1/2, -x, -y+1/2', '-z, -x+1/2, y+1/2', '-z+1/2, x+1/2, -y', 'y, z, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z, -x+1/2', '-y, -z+1/2, x+1/2', 'y+3/4, x+1/4, -z+3/4', '-y+1/4, -x+1/4, -z+1/4', 'y+1/4, -x+3/4, z+3/4', '-y+3/4, x+3/4, z+1/4', 'x+3/4, z+1/4, -y+3/4', '-x+3/4, z+3/4, y+1/4', '-x+1/4, -z+1/4, -y+1/4', 'x+1/4, -z+3/4, y+3/4', 'z+3/4, y+1/4, -x+3/4', 'z+1/4, -y+3/4, x+3/4', '-z+3/4, y+3/4, x+1/4', '-z+1/4, -y+1/4, -x+1/4', 'x, y+1/2, z+1/2', '-x, -y+1, z+1', '-x+1/2, y+1, -z+1/2', 'x+1/2, -y+1/2, -z+1', 'z, x+1/2, y+1/2', 'z+1/2, -x+1/2, -y+1', '-z, -x+1, y+1', '-z+1/2, x+1, -y+1/2', 'y, z+1/2, x+1/2', '-y+1/2, z+1, -x+1/2', 'y+1/2, -z+1/2, -x+1', '-y, -z+1, x+1', 'y+3/4, x+3/4, -z+5/4', '-y+1/4, -x+3/4, -z+3/4', 'y+1/4, -x+5/4, z+5/4', '-y+3/4, x+5/4, z+3/4', 'x+3/4, z+3/4, -y+5/4', '-x+3/4, z+5/4, y+3/4', '-x+1/4, -z+3/4, -y+3/4', 'x+1/4, -z+5/4, y+5/4', 'z+3/4, y+3/4, -x+5/4', 'z+1/4, -y+5/4, x+5/4', '-z+3/4, y+5/4, x+3/4', '-z+1/4, -y+3/4, -x+3/4', 'x+1/2, y, z+1/2', '-x+1/2, -y+1/2, z+1', '-x+1, y+1/2, -z+1/2', 'x+1, -y, -z+1', 'z+1/2, x, y+1/2', 'z+1, -x, -y+1', '-z+1/2, -x+1/2, y+1', '-z+1, x+1/2, -y+1/2', 'y+1/2, z, x+1/2', '-y+1, z+1/2, -x+1/2', 'y+1, -z, -x+1', '-y+1/2, -z+1/2, x+1', 'y+5/4, x+1/4, -z+5/4', '-y+3/4, -x+1/4, -z+3/4', 'y+3/4, -x+3/4, z+5/4', '-y+5/4, x+3/4, z+3/4', 'x+5/4, z+1/4, -y+5/4', '-x+5/4, z+3/4, y+3/4', '-x+3/4, -z+1/4, -y+3/4', 'x+3/4, -z+3/4, y+5/4', 'z+5/4, y+1/4, -x+5/4', 'z+3/4, -y+3/4, x+5/4', '-z+5/4, y+3/4, x+3/4', '-z+3/4, -y+1/4, -x+3/4', 'x+1/2, y+1/2, z', '-x+1/2, -y+1, z+1/2', '-x+1, y+1, -z', 'x+1, -y+1/2, -z+1/2', 'z+1/2, x+1/2, y', 'z+1, -x+1/2, -y+1/2', '-z+1/2, -x+1, y+1/2', '-z+1, x+1, -y', 'y+1/2, z+1/2, x', '-y+1, z+1, -x', 'y+1, -z+1/2, -x+1/2', '-y+1/2, -z+1, x+1/2', 'y+5/4, x+3/4, -z+3/4', '-y+3/4, -x+3/4, -z+1/4', 'y+3/4, -x+5/4, z+3/4', '-y+5/4, x+5/4, z+1/4', 'x+5/4, z+3/4, -y+3/4', '-x+5/4, z+5/4, y+1/4', '-x+3/4, -z+3/4, -y+1/4', 'x+3/4, -z+5/4, y+3/4', 'z+5/4, y+3/4, -x+3/4', 'z+3/4, -y+5/4, x+3/4', '-z+5/4, y+5/4, x+1/4', '-z+3/4, -y+3/4, -x+1/4'], ['1/8, y, -y+1/4', '7/8, -y+1/2, -y+3/4', '3/8, y+1/2, y+3/4', '5/8, -y, y+1/4', '-y+1/4, 1/8, y', '-y+3/4, 7/8, -y+1/2', 'y+3/4, 3/8, y+1/2', 'y+1/4, 5/8, -y', 'y, -y+1/4, 1/8', '-y+1/2, -y+3/4, 7/8', 'y+1/2, y+3/4, 3/8', '-y, y+1/4, 5/8', '1/8, y+1/2, -y+3/4', '7/8, -y+1, -y+5/4', '3/8, y+1, y+5/4', '5/8, -y+1/2, y+3/4', '-y+1/4, 5/8, y+1/2', '-y+3/4, 11/8, -y+1', 'y+3/4, 7/8, y+1', 'y+1/4, 9/8, -y+1/2', 'y, -y+3/4, 5/8', '-y+1/2, -y+5/4, 11/8', 'y+1/2, y+5/4, 7/8', '-y, y+3/4, 9/8', '5/8, y, -y+3/4', '11/8, -y+1/2, -y+5/4', '7/8, y+1/2, y+5/4', '9/8, -y, y+3/4', '-y+3/4, 1/8, y+1/2', '-y+5/4, 7/8, -y+1', 'y+5/4, 3/8, y+1', 'y+3/4, 5/8, -y+1/2', 'y+1/2, -y+1/4, 5/8', '-y+1, -y+3/4, 11/8', 'y+1, y+3/4, 7/8', '-y+1/2, y+1/4, 9/8', '5/8, y+1/2, -y+1/4', '11/8, -y+1, -y+3/4', '7/8, y+1, y+3/4', '9/8, -y+1/2, y+1/4', '-y+3/4, 5/8, y', '-y+5/4, 11/8, -y+1/2', 'y+5/4, 7/8, y+1/2', 'y+3/4, 9/8, -y', 'y+1/2, -y+3/4, 1/8', '-y+1, -y+5/4, 7/8', 'y+1, y+5/4, 3/8', '-y+1/2, y+3/4, 5/8'], ['x, 0, 0', '-x, 1/2, 1/2', '0, x, 0', '1/2, -x, 1/2', '0, 0, x', '1/2, 1/2, -x', '3/4, x+1/4, 3/4', '1/4, -x+1/4, 1/4', 'x+3/4, 1/4, 3/4', '-x+3/4, 3/4, 1/4', '3/4, 1/4, -x+3/4', '1/4, 3/4, x+3/4', 'x, 1/2, 1/2', '-x, 1, 1', '0, x+1/2, 1/2', '1/2, -x+1/2, 1', '0, 1/2, x+1/2', '1/2, 1, -x+1/2', '3/4, x+3/4, 5/4', '1/4, -x+3/4, 3/4', 'x+3/4, 3/4, 5/4', '-x+3/4, 5/4, 3/4', '3/4, 3/4, -x+5/4', '1/4, 5/4, x+5/4', 'x+1/2, 0, 1/2', '-x+1/2, 1/2, 1', '1/2, x, 1/2', '1, -x, 1', '1/2, 0, x+1/2', '1, 1/2, -x+1/2', '5/4, x+1/4, 5/4', '3/4, -x+1/4, 3/4', 'x+5/4, 1/4, 5/4', '-x+5/4, 3/4, 3/4', '5/4, 1/4, -x+5/4', '3/4, 3/4, x+5/4', 'x+1/2, 1/2, 0', '-x+1/2, 1, 1/2', '1/2, x+1/2, 0', '1, -x+1/2, 1/2', '1/2, 1/2, x', '1, 1, -x', '5/4, x+3/4, 3/4', '3/4, -x+3/4, 1/4', 'x+5/4, 3/4, 3/4', '-x+5/4, 5/4, 1/4', '5/4, 3/4, -x+3/4', '3/4, 5/4, x+3/4'], ['x, x, x', '-x, -x+1/2, x+1/2', '-x+1/2, x+1/2, -x', 'x+1/2, -x, -x+1/2', 'x+3/4, x+1/4, -x+3/4', '-x+1/4, -x+1/4, -x+1/4', 'x+1/4, -x+3/4, x+3/4', '-x+3/4, x+3/4, x+1/4', 'x, x+1/2, x+1/2', '-x, -x+1, x+1', '-x+1/2, x+1, -x+1/2', 'x+1/2, -x+1/2, -x+1', 'x+3/4, x+3/4, -x+5/4', '-x+1/4, -x+3/4, -x+3/4', 'x+1/4, -x+5/4, x+5/4', '-x+3/4, x+5/4, x+3/4', 'x+1/2, x, x+1/2', '-x+1/2, -x+1/2, x+1', '-x+1, x+1/2, -x+1/2', 'x+1, -x, -x+1', 'x+5/4, x+1/4, -x+5/4', '-x+3/4, -x+1/4, -x+3/4', 'x+3/4, -x+3/4, x+5/4', '-x+5/4, x+3/4, x+3/4', 'x+1/2, x+1/2, x', '-x+1/2, -x+1, x+1/2', '-x+1, x+1, -x', 'x+1, -x+1/2, -x+1/2', 'x+5/4, x+3/4, -x+3/4', '-x+3/4, -x+3/4, -x+1/4', 'x+3/4, -x+5/4, x+3/4', '-x+5/4, x+5/4, x+1/4'], ['5/8, 5/8, 5/8', '3/8, 7/8, 1/8', '7/8, 1/8, 3/8', '1/8, 3/8, 7/8', '5/8, 9/8, 9/8', '3/8, 11/8, 5/8', '7/8, 5/8, 7/8', '1/8, 7/8, 11/8', '9/8, 5/8, 9/8', '7/8, 7/8, 5/8', '11/8, 1/8, 7/8', '5/8, 3/8, 11/8', '9/8, 9/8, 5/8', '7/8, 11/8, 1/8', '11/8, 5/8, 3/8', '5/8, 7/8, 7/8'], ['1/8, 1/8, 1/8', '7/8, 3/8, 5/8', '3/8, 5/8, 7/8', '5/8, 7/8, 3/8', '1/8, 5/8, 5/8', '7/8, 7/8, 9/8', '3/8, 9/8, 11/8', '5/8, 11/8, 7/8', '5/8, 1/8, 5/8', '11/8, 3/8, 9/8', '7/8, 5/8, 11/8', '9/8, 7/8, 7/8', '5/8, 5/8, 1/8', '11/8, 7/8, 5/8', '7/8, 9/8, 7/8', '9/8, 11/8, 3/8'], ['1/2, 1/2, 1/2', '1/4, 3/4, 1/4', '1/2, 1, 1', '1/4, 5/4, 3/4', '1, 1/2, 1', '3/4, 3/4, 3/4', '1, 1, 1/2', '3/4, 5/4, 1/4'], ['0, 0, 0', '3/4, 1/4, 3/4', '0, 1/2, 1/2', '3/4, 3/4, 5/4', '1/2, 0, 1/2', '5/4, 1/4, 5/4', '1/2, 1/2, 0', '5/4, 3/4, 3/4']]" +211,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, -z', '-y, -x, -z', 'y, -x, z', '-y, x, z', 'x, z, -y', '-x, z, y', '-x, -z, -y', 'x, -z, y', 'z, y, -x', 'z, -y, x', '-z, y, x', '-z, -y, -x', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1/2, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y+1/2', '-z+1/2, x+1/2, -y+1/2', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', 'y+1/2, -x+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'x+1/2, z+1/2, -y+1/2', '-x+1/2, z+1/2, y+1/2', '-x+1/2, -z+1/2, -y+1/2', 'x+1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, x+1/2', '-z+1/2, -y+1/2, -x+1/2'], ['1/4, y, -y+1/2', '3/4, -y, -y+1/2', '3/4, y, y+1/2', '1/4, -y, y+1/2', '-y+1/2, 1/4, y', '-y+1/2, 3/4, -y', 'y+1/2, 3/4, y', 'y+1/2, 1/4, -y', 'y, -y+1/2, 1/4', '-y, -y+1/2, 3/4', 'y, y+1/2, 3/4', '-y, y+1/2, 1/4', '3/4, y+1/2, -y+1', '5/4, -y+1/2, -y+1', '5/4, y+1/2, y+1', '3/4, -y+1/2, y+1', '-y+1, 3/4, y+1/2', '-y+1, 5/4, -y+1/2', 'y+1, 5/4, y+1/2', 'y+1, 3/4, -y+1/2', 'y+1/2, -y+1, 3/4', '-y+1/2, -y+1, 5/4', 'y+1/2, y+1, 5/4', '-y+1/2, y+1, 3/4'], ['0, y, y', '0, -y, y', '0, y, -y', '0, -y, -y', 'y, 0, y', 'y, 0, -y', '-y, 0, y', '-y, 0, -y', 'y, y, 0', '-y, y, 0', 'y, -y, 0', '-y, -y, 0', '1/2, y+1/2, y+1/2', '1/2, -y+1/2, y+1/2', '1/2, y+1/2, -y+1/2', '1/2, -y+1/2, -y+1/2', 'y+1/2, 1/2, y+1/2', 'y+1/2, 1/2, -y+1/2', '-y+1/2, 1/2, y+1/2', '-y+1/2, 1/2, -y+1/2', 'y+1/2, y+1/2, 1/2', '-y+1/2, y+1/2, 1/2', 'y+1/2, -y+1/2, 1/2', '-y+1/2, -y+1/2, 1/2'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '1/2, x, 0', '1/2, -x, 0', 'x, 0, 1/2', '-x, 0, 1/2', '0, 1/2, -x', '0, 1/2, x', 'x+1/2, 1, 1/2', '-x+1/2, 1, 1/2', '1/2, x+1/2, 1', '1/2, -x+1/2, 1', '1, 1/2, x+1/2', '1, 1/2, -x+1/2', '1, x+1/2, 1/2', '1, -x+1/2, 1/2', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1', '1/2, 1, -x+1/2', '1/2, 1, x+1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x, -x', '-x, -x, -x', 'x, -x, x', '-x, x, x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2', 'x+1/2, x+1/2, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2'], ['1/4, 1/2, 0', '3/4, 1/2, 0', '0, 1/4, 1/2', '0, 3/4, 1/2', '1/2, 0, 1/4', '1/2, 0, 3/4', '3/4, 1, 1/2', '5/4, 1, 1/2', '1/2, 3/4, 1', '1/2, 5/4, 1', '1, 1/2, 3/4', '1, 1/2, 5/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '1/4, 3/4, 3/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 5/4', '3/4, 5/4, 5/4'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +212,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', 'y+1/4, x+3/4, -z+3/4', '-y+1/4, -x+1/4, -z+1/4', 'y+3/4, -x+3/4, z+1/4', '-y+3/4, x+1/4, z+3/4', 'x+1/4, z+3/4, -y+3/4', '-x+3/4, z+1/4, y+3/4', '-x+1/4, -z+1/4, -y+1/4', 'x+3/4, -z+3/4, y+1/4', 'z+1/4, y+3/4, -x+3/4', 'z+3/4, -y+3/4, x+1/4', '-z+3/4, y+1/4, x+3/4', '-z+1/4, -y+1/4, -x+1/4'], ['1/8, y, -y+1/4', '3/8, -y, -y+3/4', '7/8, y+1/2, y+1/4', '5/8, -y+1/2, y+3/4', '-y+1/4, 1/8, y', '-y+3/4, 3/8, -y', 'y+1/4, 7/8, y+1/2', 'y+3/4, 5/8, -y+1/2', 'y, -y+1/4, 1/8', '-y, -y+3/4, 3/8', 'y+1/2, y+1/4, 7/8', '-y+1/2, y+3/4, 5/8'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', 'x+1/4, x+3/4, -x+3/4', '-x+1/4, -x+1/4, -x+1/4', 'x+3/4, -x+3/4, x+1/4', '-x+3/4, x+1/4, x+3/4'], ['5/8, 5/8, 5/8', '7/8, 3/8, 1/8', '3/8, 1/8, 7/8', '1/8, 7/8, 3/8'], ['1/8, 1/8, 1/8', '3/8, 7/8, 5/8', '7/8, 5/8, 3/8', '5/8, 3/8, 7/8']]" +213,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', 'y+3/4, x+1/4, -z+1/4', '-y+3/4, -x+3/4, -z+3/4', 'y+1/4, -x+1/4, z+3/4', '-y+1/4, x+3/4, z+1/4', 'x+3/4, z+1/4, -y+1/4', '-x+1/4, z+3/4, y+1/4', '-x+3/4, -z+3/4, -y+3/4', 'x+1/4, -z+1/4, y+3/4', 'z+3/4, y+1/4, -x+1/4', 'z+1/4, -y+1/4, x+3/4', '-z+1/4, y+3/4, x+1/4', '-z+3/4, -y+3/4, -x+3/4'], ['1/8, y, y+1/4', '3/8, -y, y+3/4', '7/8, y+1/2, -y+1/4', '5/8, -y+1/2, -y+3/4', 'y+1/4, 1/8, y', 'y+3/4, 3/8, -y', '-y+1/4, 7/8, y+1/2', '-y+3/4, 5/8, -y+1/2', 'y, y+1/4, 1/8', '-y, y+3/4, 3/8', 'y+1/2, -y+1/4, 7/8', '-y+1/2, -y+3/4, 5/8'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', 'x+3/4, x+1/4, -x+1/4', '-x+3/4, -x+3/4, -x+3/4', 'x+1/4, -x+1/4, x+3/4', '-x+1/4, x+3/4, x+1/4'], ['7/8, 7/8, 7/8', '5/8, 1/8, 3/8', '1/8, 3/8, 5/8', '3/8, 5/8, 1/8'], ['3/8, 3/8, 3/8', '1/8, 5/8, 7/8', '5/8, 7/8, 1/8', '7/8, 1/8, 5/8']]" +214,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', 'y+3/4, x+1/4, -z+1/4', '-y+3/4, -x+3/4, -z+3/4', 'y+1/4, -x+1/4, z+3/4', '-y+1/4, x+3/4, z+1/4', 'x+3/4, z+1/4, -y+1/4', '-x+1/4, z+3/4, y+1/4', '-x+3/4, -z+3/4, -y+3/4', 'x+1/4, -z+1/4, y+3/4', 'z+3/4, y+1/4, -x+1/4', 'z+1/4, -y+1/4, x+3/4', '-z+1/4, y+3/4, x+1/4', '-z+3/4, -y+3/4, -x+3/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1, -x+1, -y+1/2', '-z+1, -x+1/2, y+1', '-z+1/2, x+1, -y+1', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1, -x+1', 'y+1, -z+1, -x+1/2', '-y+1, -z+1/2, x+1', 'y+5/4, x+3/4, -z+3/4', '-y+5/4, -x+5/4, -z+5/4', 'y+3/4, -x+3/4, z+5/4', '-y+3/4, x+5/4, z+3/4', 'x+5/4, z+3/4, -y+3/4', '-x+3/4, z+5/4, y+3/4', '-x+5/4, -z+5/4, -y+5/4', 'x+3/4, -z+3/4, y+5/4', 'z+5/4, y+3/4, -x+3/4', 'z+3/4, -y+3/4, x+5/4', '-z+3/4, y+5/4, x+3/4', '-z+5/4, -y+5/4, -x+5/4'], ['1/8, y, -y+1/4', '3/8, -y, -y+3/4', '7/8, y+1/2, y+1/4', '5/8, -y+1/2, y+3/4', '-y+1/4, 1/8, y', '-y+3/4, 3/8, -y', 'y+1/4, 7/8, y+1/2', 'y+3/4, 5/8, -y+1/2', 'y, -y+1/4, 1/8', '-y, -y+3/4, 3/8', 'y+1/2, y+1/4, 7/8', '-y+1/2, y+3/4, 5/8', '5/8, y+1/2, -y+3/4', '7/8, -y+1/2, -y+5/4', '11/8, y+1, y+3/4', '9/8, -y+1, y+5/4', '-y+3/4, 5/8, y+1/2', '-y+5/4, 7/8, -y+1/2', 'y+3/4, 11/8, y+1', 'y+5/4, 9/8, -y+1', 'y+1/2, -y+3/4, 5/8', '-y+1/2, -y+5/4, 7/8', 'y+1, y+3/4, 11/8', '-y+1, y+5/4, 9/8'], ['1/8, y, y+1/4', '3/8, -y, y+3/4', '7/8, y+1/2, -y+1/4', '5/8, -y+1/2, -y+3/4', 'y+1/4, 1/8, y', 'y+3/4, 3/8, -y', '-y+1/4, 7/8, y+1/2', '-y+3/4, 5/8, -y+1/2', 'y, y+1/4, 1/8', '-y, y+3/4, 3/8', 'y+1/2, -y+1/4, 7/8', '-y+1/2, -y+3/4, 5/8', '5/8, y+1/2, y+3/4', '7/8, -y+1/2, y+5/4', '11/8, y+1, -y+3/4', '9/8, -y+1, -y+5/4', 'y+3/4, 5/8, y+1/2', 'y+5/4, 7/8, -y+1/2', '-y+3/4, 11/8, y+1', '-y+5/4, 9/8, -y+1', 'y+1/2, y+3/4, 5/8', '-y+1/2, y+5/4, 7/8', 'y+1, -y+3/4, 11/8', '-y+1, -y+5/4, 9/8'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '1/4, x, 0', '3/4, -x+1/2, 0', '0, 1/4, x', '0, 3/4, -x+1/2', '3/4, x+1/4, 0', '3/4, -x+3/4, 1/2', 'x+3/4, 1/2, 1/4', '-x+1/4, 0, 1/4', '0, 1/4, -x+1/4', '1/2, 1/4, x+3/4', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '3/4, x+1/2, 1/2', '5/4, -x+1, 1/2', '1/2, 3/4, x+1/2', '1/2, 5/4, -x+1', '5/4, x+3/4, 1/2', '5/4, -x+5/4, 1', 'x+5/4, 1, 3/4', '-x+3/4, 1/2, 3/4', '1/2, 3/4, -x+3/4', '1, 3/4, x+5/4'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', 'x+3/4, x+1/4, -x+1/4', '-x+3/4, -x+3/4, -x+3/4', 'x+1/4, -x+1/4, x+3/4', '-x+1/4, x+3/4, x+1/4', 'x+1/2, x+1/2, x+1/2', '-x+1, -x+1/2, x+1', '-x+1/2, x+1, -x+1', 'x+1, -x+1, -x+1/2', 'x+5/4, x+3/4, -x+3/4', '-x+5/4, -x+5/4, -x+5/4', 'x+3/4, -x+3/4, x+5/4', '-x+3/4, x+5/4, x+3/4'], ['5/8, 0, 1/4', '7/8, 0, 3/4', '1/4, 5/8, 0', '3/4, 7/8, 0', '0, 1/4, 5/8', '0, 3/4, 7/8', '9/8, 1/2, 3/4', '11/8, 1/2, 5/4', '3/4, 9/8, 1/2', '5/4, 11/8, 1/2', '1/2, 3/4, 9/8', '1/2, 5/4, 11/8'], ['1/8, 0, 1/4', '3/8, 0, 3/4', '1/4, 1/8, 0', '3/4, 3/8, 0', '0, 1/4, 1/8', '0, 3/4, 3/8', '5/8, 1/2, 3/4', '7/8, 1/2, 5/4', '3/4, 5/8, 1/2', '5/4, 7/8, 1/2', '1/2, 3/4, 5/8', '1/2, 5/4, 7/8'], ['7/8, 7/8, 7/8', '5/8, 1/8, 3/8', '1/8, 3/8, 5/8', '3/8, 5/8, 1/8', '11/8, 11/8, 11/8', '9/8, 5/8, 7/8', '5/8, 7/8, 9/8', '7/8, 9/8, 5/8'], ['1/8, 1/8, 1/8', '3/8, 7/8, 5/8', '7/8, 5/8, 3/8', '5/8, 3/8, 7/8', '5/8, 5/8, 5/8', '7/8, 11/8, 9/8', '11/8, 9/8, 7/8', '9/8, 7/8, 11/8']]" +215,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, z', '-y, -x, z', 'y, -x, -z', '-y, x, -z', 'x, z, y', '-x, z, -y', '-x, -z, y', 'x, -z, -y', 'z, y, x', 'z, -y, -x', '-z, y, -x', '-z, -y, x'], ['x, x, z', '-x, -x, z', '-x, x, -z', 'x, -x, -z', 'z, x, x', 'z, -x, -x', '-z, -x, x', '-z, x, -x', 'x, z, x', '-x, z, -x', 'x, -z, -x', '-x, -z, x'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '1/2, x, 0', '1/2, -x, 0', 'x, 0, 1/2', '-x, 0, 1/2', '0, 1/2, x', '0, 1/2, -x'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x'], ['1/2, 0, 0', '0, 1/2, 0', '0, 0, 1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0'], ['1/2, 1/2, 1/2'], ['0, 0, 0']]" +216,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, z', '-y, -x, z', 'y, -x, -z', '-y, x, -z', 'x, z, y', '-x, z, -y', '-x, -z, y', 'x, -z, -y', 'z, y, x', 'z, -y, -x', '-z, y, -x', '-z, -y, x', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', 'y, x+1/2, z+1/2', '-y, -x+1/2, z+1/2', 'y, -x+1/2, -z+1/2', '-y, x+1/2, -z+1/2', 'x, z+1/2, y+1/2', '-x, z+1/2, -y+1/2', '-x, -z+1/2, y+1/2', 'x, -z+1/2, -y+1/2', 'z, y+1/2, x+1/2', 'z, -y+1/2, -x+1/2', '-z, y+1/2, -x+1/2', '-z, -y+1/2, x+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', 'y+1/2, x, z+1/2', '-y+1/2, -x, z+1/2', 'y+1/2, -x, -z+1/2', '-y+1/2, x, -z+1/2', 'x+1/2, z, y+1/2', '-x+1/2, z, -y+1/2', '-x+1/2, -z, y+1/2', 'x+1/2, -z, -y+1/2', 'z+1/2, y, x+1/2', 'z+1/2, -y, -x+1/2', '-z+1/2, y, -x+1/2', '-z+1/2, -y, x+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x', 'y+1/2, x+1/2, z', '-y+1/2, -x+1/2, z', 'y+1/2, -x+1/2, -z', '-y+1/2, x+1/2, -z', 'x+1/2, z+1/2, y', '-x+1/2, z+1/2, -y', '-x+1/2, -z+1/2, y', 'x+1/2, -z+1/2, -y', 'z+1/2, y+1/2, x', 'z+1/2, -y+1/2, -x', '-z+1/2, y+1/2, -x', '-z+1/2, -y+1/2, x'], ['x, x, z', '-x, -x, z', '-x, x, -z', 'x, -x, -z', 'z, x, x', 'z, -x, -x', '-z, -x, x', '-z, x, -x', 'x, z, x', '-x, z, -x', 'x, -z, -x', '-x, -z, x', 'x, x+1/2, z+1/2', '-x, -x+1/2, z+1/2', '-x, x+1/2, -z+1/2', 'x, -x+1/2, -z+1/2', 'z, x+1/2, x+1/2', 'z, -x+1/2, -x+1/2', '-z, -x+1/2, x+1/2', '-z, x+1/2, -x+1/2', 'x, z+1/2, x+1/2', '-x, z+1/2, -x+1/2', 'x, -z+1/2, -x+1/2', '-x, -z+1/2, x+1/2', 'x+1/2, x, z+1/2', '-x+1/2, -x, z+1/2', '-x+1/2, x, -z+1/2', 'x+1/2, -x, -z+1/2', 'z+1/2, x, x+1/2', 'z+1/2, -x, -x+1/2', '-z+1/2, -x, x+1/2', '-z+1/2, x, -x+1/2', 'x+1/2, z, x+1/2', '-x+1/2, z, -x+1/2', 'x+1/2, -z, -x+1/2', '-x+1/2, -z, x+1/2', 'x+1/2, x+1/2, z', '-x+1/2, -x+1/2, z', '-x+1/2, x+1/2, -z', 'x+1/2, -x+1/2, -z', 'z+1/2, x+1/2, x', 'z+1/2, -x+1/2, -x', '-z+1/2, -x+1/2, x', '-z+1/2, x+1/2, -x', 'x+1/2, z+1/2, x', '-x+1/2, z+1/2, -x', 'x+1/2, -z+1/2, -x', '-x+1/2, -z+1/2, x'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x'], ['3/4, 3/4, 3/4', '3/4, 5/4, 5/4', '5/4, 3/4, 5/4', '5/4, 5/4, 3/4'], ['1/4, 1/4, 1/4', '1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['1/2, 1/2, 1/2', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +217,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, z', '-y, -x, z', 'y, -x, -z', '-y, x, -z', 'x, z, y', '-x, z, -y', '-x, -z, y', 'x, -z, -y', 'z, y, x', 'z, -y, -x', '-z, y, -x', '-z, -y, x', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1/2, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y+1/2', '-z+1/2, x+1/2, -y+1/2', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x+1/2', 'y+1/2, x+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, z+1/2, y+1/2', '-x+1/2, z+1/2, -y+1/2', '-x+1/2, -z+1/2, y+1/2', 'x+1/2, -z+1/2, -y+1/2', 'z+1/2, y+1/2, x+1/2', 'z+1/2, -y+1/2, -x+1/2', '-z+1/2, y+1/2, -x+1/2', '-z+1/2, -y+1/2, x+1/2'], ['x, x, z', '-x, -x, z', '-x, x, -z', 'x, -x, -z', 'z, x, x', 'z, -x, -x', '-z, -x, x', '-z, x, -x', 'x, z, x', '-x, z, -x', 'x, -z, -x', '-x, -z, x', 'x+1/2, x+1/2, z+1/2', '-x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, -z+1/2', 'x+1/2, -x+1/2, -z+1/2', 'z+1/2, x+1/2, x+1/2', 'z+1/2, -x+1/2, -x+1/2', '-z+1/2, -x+1/2, x+1/2', '-z+1/2, x+1/2, -x+1/2', 'x+1/2, z+1/2, x+1/2', '-x+1/2, z+1/2, -x+1/2', 'x+1/2, -z+1/2, -x+1/2', '-x+1/2, -z+1/2, x+1/2'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '1/2, x, 0', '1/2, -x, 0', 'x, 0, 1/2', '-x, 0, 1/2', '0, 1/2, x', '0, 1/2, -x', 'x+1/2, 1, 1/2', '-x+1/2, 1, 1/2', '1/2, x+1/2, 1', '1/2, -x+1/2, 1', '1, 1/2, x+1/2', '1, 1/2, -x+1/2', '1, x+1/2, 1/2', '1, -x+1/2, 1/2', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1', '1/2, 1, x+1/2', '1/2, 1, -x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2'], ['1/4, 1/2, 0', '3/4, 1/2, 0', '0, 1/4, 1/2', '0, 3/4, 1/2', '1/2, 0, 1/4', '1/2, 0, 3/4', '3/4, 1, 1/2', '5/4, 1, 1/2', '1/2, 3/4, 1', '1/2, 5/4, 1', '1, 1/2, 3/4', '1, 1/2, 5/4'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +218,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y+1/2, x+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, z+1/2, y+1/2', '-x+1/2, z+1/2, -y+1/2', '-x+1/2, -z+1/2, y+1/2', 'x+1/2, -z+1/2, -y+1/2', 'z+1/2, y+1/2, x+1/2', 'z+1/2, -y+1/2, -x+1/2', '-z+1/2, y+1/2, -x+1/2', '-z+1/2, -y+1/2, x+1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, 0, x+1/2', '1/2, 0, -x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', 'x+1/2, -x+1/2, -x+1/2', '-x+1/2, x+1/2, -x+1/2'], ['1/4, 0, 1/2', '3/4, 0, 1/2', '1/2, 1/4, 0', '1/2, 3/4, 0', '0, 1/2, 1/4', '0, 1/2, 3/4'], ['1/4, 1/2, 0', '3/4, 1/2, 0', '0, 1/4, 1/2', '0, 3/4, 1/2', '1/2, 0, 1/4', '1/2, 0, 3/4'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '0, 1/2, 0', '1/2, 0, 0', '0, 0, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +219,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y+1/2, x+1/2, z+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-y+1/2, x+1/2, -z+1/2', 'x+1/2, z+1/2, y+1/2', '-x+1/2, z+1/2, -y+1/2', '-x+1/2, -z+1/2, y+1/2', 'x+1/2, -z+1/2, -y+1/2', 'z+1/2, y+1/2, x+1/2', 'z+1/2, -y+1/2, -x+1/2', '-z+1/2, y+1/2, -x+1/2', '-z+1/2, -y+1/2, x+1/2', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', 'y+1/2, x+1, z+1', '-y+1/2, -x+1, z+1', 'y+1/2, -x+1, -z+1', '-y+1/2, x+1, -z+1', 'x+1/2, z+1, y+1', '-x+1/2, z+1, -y+1', '-x+1/2, -z+1, y+1', 'x+1/2, -z+1, -y+1', 'z+1/2, y+1, x+1', 'z+1/2, -y+1, -x+1', '-z+1/2, y+1, -x+1', '-z+1/2, -y+1, x+1', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', 'y+1, x+1/2, z+1', '-y+1, -x+1/2, z+1', 'y+1, -x+1/2, -z+1', '-y+1, x+1/2, -z+1', 'x+1, z+1/2, y+1', '-x+1, z+1/2, -y+1', '-x+1, -z+1/2, y+1', 'x+1, -z+1/2, -y+1', 'z+1, y+1/2, x+1', 'z+1, -y+1/2, -x+1', '-z+1, y+1/2, -x+1', '-z+1, -y+1/2, x+1', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x', 'y+1, x+1, z+1/2', '-y+1, -x+1, z+1/2', 'y+1, -x+1, -z+1/2', '-y+1, x+1, -z+1/2', 'x+1, z+1, y+1/2', '-x+1, z+1, -y+1/2', '-x+1, -z+1, y+1/2', 'x+1, -z+1, -y+1/2', 'z+1, y+1, x+1/2', 'z+1, -y+1, -x+1/2', '-z+1, y+1, -x+1/2', '-z+1, -y+1, x+1/2'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', '3/4, x+1/2, 3/4', '1/4, -x+1/2, 3/4', 'x+1/2, 3/4, 3/4', '-x+1/2, 3/4, 1/4', '3/4, 3/4, x+1/2', '3/4, 1/4, -x+1/2', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', '3/4, x+1, 5/4', '1/4, -x+1, 5/4', 'x+1/2, 5/4, 5/4', '-x+1/2, 5/4, 3/4', '3/4, 5/4, x+1', '3/4, 3/4, -x+1', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', '5/4, x+1/2, 5/4', '3/4, -x+1/2, 5/4', 'x+1, 3/4, 5/4', '-x+1, 3/4, 3/4', '5/4, 3/4, x+1', '5/4, 1/4, -x+1', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x', '5/4, x+1, 3/4', '3/4, -x+1, 3/4', 'x+1, 5/4, 3/4', '-x+1, 5/4, 1/4', '5/4, 5/4, x+1/2', '5/4, 3/4, -x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', '1/2, x+1, 1', '1/2, -x+1, 1', 'x+1/2, 1, 1', '-x+1/2, 1, 1', '1/2, 1, x+1', '1/2, 1, -x+1', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', '1, x+1/2, 1', '1, -x+1/2, 1', 'x+1, 1/2, 1', '-x+1, 1/2, 1', '1, 1/2, x+1', '1, 1/2, -x+1', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x', '1, x+1, 1/2', '1, -x+1, 1/2', 'x+1, 1, 1/2', '-x+1, 1, 1/2', '1, 1, x+1/2', '1, 1, -x+1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', 'x+1/2, -x+1/2, -x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', 'x+1/2, x+1, x+1', '-x+1/2, -x+1, x+1', 'x+1/2, -x+1, -x+1', '-x+1/2, x+1, -x+1', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', 'x+1, x+1/2, x+1', '-x+1, -x+1/2, x+1', 'x+1, -x+1/2, -x+1', '-x+1, x+1/2, -x+1', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x', 'x+1, x+1, x+1/2', '-x+1, -x+1, x+1/2', 'x+1, -x+1, -x+1/2', '-x+1, x+1, -x+1/2'], ['1/4, 0, 0', '3/4, 0, 0', '0, 1/4, 0', '0, 3/4, 0', '0, 0, 1/4', '0, 0, 3/4', '1/4, 1/2, 1/2', '3/4, 1/2, 1/2', '0, 3/4, 1/2', '0, 5/4, 1/2', '0, 1/2, 3/4', '0, 1/2, 5/4', '3/4, 0, 1/2', '5/4, 0, 1/2', '1/2, 1/4, 1/2', '1/2, 3/4, 1/2', '1/2, 0, 3/4', '1/2, 0, 5/4', '3/4, 1/2, 0', '5/4, 1/2, 0', '1/2, 3/4, 0', '1/2, 5/4, 0', '1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 1/4, 1/4', '0, 3/4, 1/4', '1/4, 0, 1/4', '1/4, 0, 3/4', '1/4, 1/4, 0', '3/4, 1/4, 0', '0, 3/4, 3/4', '0, 5/4, 3/4', '1/4, 1/2, 3/4', '1/4, 1/2, 5/4', '1/4, 3/4, 1/2', '3/4, 3/4, 1/2', '1/2, 1/4, 3/4', '1/2, 3/4, 3/4', '3/4, 0, 3/4', '3/4, 0, 5/4', '3/4, 1/4, 1/2', '5/4, 1/4, 1/2', '1/2, 3/4, 1/4', '1/2, 5/4, 1/4', '3/4, 1/2, 1/4', '3/4, 1/2, 3/4', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4', '1/4, 3/4, 3/4', '3/4, 5/4, 5/4', '3/4, 1/4, 3/4', '5/4, 3/4, 5/4', '3/4, 3/4, 1/4', '5/4, 5/4, 3/4'], ['0, 0, 0', '1/2, 1/2, 1/2', '0, 1/2, 1/2', '1/2, 1, 1', '1/2, 0, 1/2', '1, 1/2, 1', '1/2, 1/2, 0', '1, 1, 1/2']]" +220,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', 'y+1/4, x+1/4, z+1/4', '-y+1/4, -x+3/4, z+3/4', 'y+3/4, -x+1/4, -z+3/4', '-y+3/4, x+3/4, -z+1/4', 'x+1/4, z+1/4, y+1/4', '-x+3/4, z+3/4, -y+1/4', '-x+1/4, -z+3/4, y+3/4', 'x+3/4, -z+1/4, -y+3/4', 'z+1/4, y+1/4, x+1/4', 'z+3/4, -y+1/4, -x+3/4', '-z+3/4, y+3/4, -x+1/4', '-z+1/4, -y+3/4, x+3/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1, -x+1, -y+1/2', '-z+1, -x+1/2, y+1', '-z+1/2, x+1, -y+1', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1, -x+1', 'y+1, -z+1, -x+1/2', '-y+1, -z+1/2, x+1', 'y+3/4, x+3/4, z+3/4', '-y+3/4, -x+5/4, z+5/4', 'y+5/4, -x+3/4, -z+5/4', '-y+5/4, x+5/4, -z+3/4', 'x+3/4, z+3/4, y+3/4', '-x+5/4, z+5/4, -y+3/4', '-x+3/4, -z+5/4, y+5/4', 'x+5/4, -z+3/4, -y+5/4', 'z+3/4, y+3/4, x+3/4', 'z+5/4, -y+3/4, -x+5/4', '-z+5/4, y+5/4, -x+3/4', '-z+3/4, -y+5/4, x+5/4'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '1/4, x, 0', '3/4, -x+1/2, 0', '0, 1/4, x', '0, 3/4, -x+1/2', '1/4, x+1/4, 1/2', '1/4, -x+3/4, 0', 'x+1/4, 1/2, 1/4', '-x+3/4, 0, 1/4', '1/2, 1/4, x+1/4', '0, 1/4, -x+3/4', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '3/4, x+1/2, 1/2', '5/4, -x+1, 1/2', '1/2, 3/4, x+1/2', '1/2, 5/4, -x+1', '3/4, x+3/4, 1', '3/4, -x+5/4, 1/2', 'x+3/4, 1, 3/4', '-x+5/4, 1/2, 3/4', '1, 3/4, x+3/4', '1/2, 3/4, -x+5/4'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', 'x+1/4, x+1/4, x+1/4', '-x+1/4, -x+3/4, x+3/4', 'x+3/4, -x+1/4, -x+3/4', '-x+3/4, x+3/4, -x+1/4', 'x+1/2, x+1/2, x+1/2', '-x+1, -x+1/2, x+1', '-x+1/2, x+1, -x+1', 'x+1, -x+1, -x+1/2', 'x+3/4, x+3/4, x+3/4', '-x+3/4, -x+5/4, x+5/4', 'x+5/4, -x+3/4, -x+5/4', '-x+5/4, x+5/4, -x+3/4'], ['7/8, 0, 1/4', '5/8, 0, 3/4', '1/4, 7/8, 0', '3/4, 5/8, 0', '0, 1/4, 7/8', '0, 3/4, 5/8', '11/8, 1/2, 3/4', '9/8, 1/2, 5/4', '3/4, 11/8, 1/2', '5/4, 9/8, 1/2', '1/2, 3/4, 11/8', '1/2, 5/4, 9/8'], ['3/8, 0, 1/4', '1/8, 0, 3/4', '1/4, 3/8, 0', '3/4, 1/8, 0', '0, 1/4, 3/8', '0, 3/4, 1/8', '7/8, 1/2, 3/4', '5/8, 1/2, 5/4', '3/4, 7/8, 1/2', '5/4, 5/8, 1/2', '1/2, 3/4, 7/8', '1/2, 5/4, 5/8']]" +221,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, -z', '-y, -x, -z', 'y, -x, z', '-y, x, z', 'x, z, -y', '-x, z, y', '-x, -z, -y', 'x, -z, y', 'z, y, -x', 'z, -y, x', '-z, y, x', '-z, -y, -x', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', '-y, -x, z', 'y, x, z', '-y, x, -z', 'y, -x, -z', '-x, -z, y', 'x, -z, -y', 'x, z, y', '-x, z, -y', '-z, -y, x', '-z, y, -x', 'z, -y, -x', 'z, y, x'], ['x, x, z', '-x, -x, z', '-x, x, -z', 'x, -x, -z', 'z, x, x', 'z, -x, -x', '-z, -x, x', '-z, x, -x', 'x, z, x', '-x, z, -x', 'x, -z, -x', '-x, -z, x', 'x, x, -z', '-x, -x, -z', 'x, -x, z', '-x, x, z', 'x, z, -x', '-x, z, x', '-x, -z, -x', 'x, -z, x', 'z, x, -x', 'z, -x, x', '-z, x, x', '-z, -x, -x'], ['1/2, y, z', '1/2, -y, z', '1/2, y, -z', '1/2, -y, -z', 'z, 1/2, y', 'z, 1/2, -y', '-z, 1/2, y', '-z, 1/2, -y', 'y, z, 1/2', '-y, z, 1/2', 'y, -z, 1/2', '-y, -z, 1/2', 'y, 1/2, -z', '-y, 1/2, -z', 'y, 1/2, z', '-y, 1/2, z', '1/2, z, -y', '1/2, z, y', '1/2, -z, -y', '1/2, -z, y', 'z, y, 1/2', 'z, -y, 1/2', '-z, y, 1/2', '-z, -y, 1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', 'y, 0, -z', '-y, 0, -z', 'y, 0, z', '-y, 0, z', '0, z, -y', '0, z, y', '0, -z, -y', '0, -z, y', 'z, y, 0', 'z, -y, 0', '-z, y, 0', '-z, -y, 0'], ['1/2, y, y', '1/2, -y, y', '1/2, y, -y', '1/2, -y, -y', 'y, 1/2, y', 'y, 1/2, -y', '-y, 1/2, y', '-y, 1/2, -y', 'y, y, 1/2', '-y, y, 1/2', 'y, -y, 1/2', '-y, -y, 1/2'], ['0, y, y', '0, -y, y', '0, y, -y', '0, -y, -y', 'y, 0, y', 'y, 0, -y', '-y, 0, y', '-y, 0, -y', 'y, y, 0', '-y, y, 0', 'y, -y, 0', '-y, -y, 0'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '1/2, x, 0', '1/2, -x, 0', 'x, 0, 1/2', '-x, 0, 1/2', '0, 1/2, -x', '0, 1/2, x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x, -x', '-x, -x, -x', 'x, -x, x', '-x, x, x'], ['x, 1/2, 1/2', '-x, 1/2, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 1/2, x', '1/2, 1/2, -x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x'], ['1/2, 0, 0', '0, 1/2, 0', '0, 0, 1/2'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0'], ['1/2, 1/2, 1/2'], ['0, 0, 0']]" +222,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x+1/2, y, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x, y', 'z, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y', '-z+1/2, x, -y+1/2', 'y, z, x', '-y+1/2, z, -x+1/2', 'y, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x', 'y, x, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', 'y, -x+1/2, z', '-y+1/2, x, z', 'x, z, -y+1/2', '-x+1/2, z, y', '-x+1/2, -z+1/2, -y+1/2', 'x, -z+1/2, y', 'z, y, -x+1/2', 'z, -y+1/2, x', '-z+1/2, y, x', '-z+1/2, -y+1/2, -x+1/2', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y, z+1/2', '-x, y+1/2, z+1/2', '-z, -x, -y', '-z, x+1/2, y+1/2', 'z+1/2, x+1/2, -y', 'z+1/2, -x, y+1/2', '-y, -z, -x', 'y+1/2, -z, x+1/2', '-y, z+1/2, x+1/2', 'y+1/2, z+1/2, -x', '-y, -x, z+1/2', 'y+1/2, x+1/2, z+1/2', '-y, x+1/2, -z', 'y+1/2, -x, -z', '-x, -z, y+1/2', 'x+1/2, -z, -y', 'x+1/2, z+1/2, y+1/2', '-x, z+1/2, -y', '-z, -y, x+1/2', '-z, y+1/2, -x', 'z+1/2, -y, -x', 'z+1/2, y+1/2, x+1/2'], ['1/4, y, y', '1/4, -y+1/2, y', '1/4, y, -y+1/2', '1/4, -y+1/2, -y+1/2', 'y, 1/4, y', 'y, 1/4, -y+1/2', '-y+1/2, 1/4, y', '-y+1/2, 1/4, -y+1/2', 'y, y, 1/4', '-y+1/2, y, 1/4', 'y, -y+1/2, 1/4', '-y+1/2, -y+1/2, 1/4', '3/4, -y, -y', '3/4, y+1/2, -y', '3/4, -y, y+1/2', '3/4, y+1/2, y+1/2', '-y, 3/4, -y', '-y, 3/4, y+1/2', 'y+1/2, 3/4, -y', 'y+1/2, 3/4, y+1/2', '-y, -y, 3/4', 'y+1/2, -y, 3/4', '-y, y+1/2, 3/4', 'y+1/2, y+1/2, 3/4'], ['x, 3/4, 1/4', '-x+1/2, 3/4, 1/4', '1/4, x, 3/4', '1/4, -x+1/2, 3/4', '3/4, 1/4, x', '3/4, 1/4, -x+1/2', '3/4, x, 1/4', '3/4, -x+1/2, 1/4', 'x, 1/4, 3/4', '-x+1/2, 1/4, 3/4', '1/4, 3/4, -x+1/2', '1/4, 3/4, x', '-x, 1/4, 3/4', 'x+1/2, 1/4, 3/4', '3/4, -x, 1/4', '3/4, x+1/2, 1/4', '1/4, 3/4, -x', '1/4, 3/4, x+1/2', '1/4, -x, 3/4', '1/4, x+1/2, 3/4', '-x, 3/4, 1/4', 'x+1/2, 3/4, 1/4', '3/4, 1/4, x+1/2', '3/4, 1/4, -x'], ['x, x, x', '-x+1/2, -x+1/2, x', '-x+1/2, x, -x+1/2', 'x, -x+1/2, -x+1/2', 'x, x, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x, -x+1/2, x', '-x+1/2, x, x', '-x, -x, -x', 'x+1/2, x+1/2, -x', 'x+1/2, -x, x+1/2', '-x, x+1/2, x+1/2', '-x, -x, x+1/2', 'x+1/2, x+1/2, x+1/2', '-x, x+1/2, -x', 'x+1/2, -x, -x'], ['x, 1/4, 1/4', '-x+1/2, 1/4, 1/4', '1/4, x, 1/4', '1/4, -x+1/2, 1/4', '1/4, 1/4, x', '1/4, 1/4, -x+1/2', '-x, 3/4, 3/4', 'x+1/2, 3/4, 3/4', '3/4, -x, 3/4', '3/4, x+1/2, 3/4', '3/4, 3/4, -x', '3/4, 3/4, x+1/2'], ['0, 3/4, 1/4', '1/2, 3/4, 1/4', '1/4, 0, 3/4', '1/4, 1/2, 3/4', '3/4, 1/4, 0', '3/4, 1/4, 1/2', '3/4, 0, 1/4', '3/4, 1/2, 1/4', '0, 1/4, 3/4', '1/2, 1/4, 3/4', '1/4, 3/4, 1/2', '1/4, 3/4, 0'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '0, 0, 1/2', '1/2, 1/2, 1/2', '0, 1/2, 0', '1/2, 0, 0'], ['3/4, 1/4, 1/4', '1/4, 3/4, 1/4', '1/4, 1/4, 3/4', '1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4']]" +223,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', 'y+1/2, -x+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'x+1/2, z+1/2, -y+1/2', '-x+1/2, z+1/2, y+1/2', '-x+1/2, -z+1/2, -y+1/2', 'x+1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, x+1/2', '-z+1/2, -y+1/2, -x+1/2', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2', '-y+1/2, x+1/2, -z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-x+1/2, -z+1/2, y+1/2', 'x+1/2, -z+1/2, -y+1/2', 'x+1/2, z+1/2, y+1/2', '-x+1/2, z+1/2, -y+1/2', '-z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, -x+1/2', 'z+1/2, y+1/2, x+1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', 'y+1/2, 1/2, -z+1/2', '-y+1/2, 1/2, -z+1/2', 'y+1/2, 1/2, z+1/2', '-y+1/2, 1/2, z+1/2', '1/2, z+1/2, -y+1/2', '1/2, z+1/2, y+1/2', '1/2, -z+1/2, -y+1/2', '1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, 1/2', 'z+1/2, -y+1/2, 1/2', '-z+1/2, y+1/2, 1/2', '-z+1/2, -y+1/2, 1/2'], ['1/4, y, y+1/2', '3/4, -y, y+1/2', '3/4, y, -y+1/2', '1/4, -y, -y+1/2', 'y+1/2, 1/4, y', 'y+1/2, 3/4, -y', '-y+1/2, 3/4, y', '-y+1/2, 1/4, -y', 'y, y+1/2, 1/4', '-y, y+1/2, 3/4', 'y, -y+1/2, 3/4', '-y, -y+1/2, 1/4', '3/4, -y, -y+1/2', '1/4, y, -y+1/2', '1/4, -y, y+1/2', '3/4, y, y+1/2', '-y+1/2, 3/4, -y', '-y+1/2, 1/4, y', 'y+1/2, 1/4, -y', 'y+1/2, 3/4, y', '-y, -y+1/2, 3/4', 'y, -y+1/2, 1/4', '-y, y+1/2, 1/4', 'y, y+1/2, 3/4'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, x+1/2', '-x, -x, -x', 'x, x, -x', 'x, -x, x', '-x, x, x', '-x+1/2, -x+1/2, x+1/2', 'x+1/2, x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2'], ['x, 1/2, 0', '-x, 1/2, 0', '0, x, 1/2', '0, -x, 1/2', '1/2, 0, x', '1/2, 0, -x', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, 0, -x+1/2', '1/2, 0, x+1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '0, 1/2, -x+1/2', '0, 1/2, x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, 1/2, -x+1/2', '1/2, 1/2, x+1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '1/4, 3/4, 3/4', '3/4, 3/4, 3/4', '1/4, 1/4, 3/4', '1/4, 3/4, 1/4', '3/4, 1/4, 1/4'], ['1/4, 1/2, 0', '3/4, 1/2, 0', '0, 1/4, 1/2', '0, 3/4, 1/2', '1/2, 0, 1/4', '1/2, 0, 3/4'], ['1/4, 0, 1/2', '3/4, 0, 1/2', '1/2, 1/4, 0', '1/2, 3/4, 0', '0, 1/2, 1/4', '0, 1/2, 3/4'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '0, 1/2, 0', '1/2, 0, 0', '0, 0, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +224,"[['x, y, z', '-x+1/2, -y+1/2, z', '-x+1/2, y, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x, y', 'z, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y', '-z+1/2, x, -y+1/2', 'y, z, x', '-y+1/2, z, -x+1/2', 'y, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x', 'y+1/2, x+1/2, -z', '-y, -x, -z', 'y+1/2, -x, z+1/2', '-y, x+1/2, z+1/2', 'x+1/2, z+1/2, -y', '-x, z+1/2, y+1/2', '-x, -z, -y', 'x+1/2, -z, y+1/2', 'z+1/2, y+1/2, -x', 'z+1/2, -y, x+1/2', '-z, y+1/2, x+1/2', '-z, -y, -x', '-x, -y, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y, z+1/2', '-x, y+1/2, z+1/2', '-z, -x, -y', '-z, x+1/2, y+1/2', 'z+1/2, x+1/2, -y', 'z+1/2, -x, y+1/2', '-y, -z, -x', 'y+1/2, -z, x+1/2', '-y, z+1/2, x+1/2', 'y+1/2, z+1/2, -x', '-y+1/2, -x+1/2, z', 'y, x, z', '-y+1/2, x, -z+1/2', 'y, -x+1/2, -z+1/2', '-x+1/2, -z+1/2, y', 'x, -z+1/2, -y+1/2', 'x, z, y', '-x+1/2, z, -y+1/2', '-z+1/2, -y+1/2, x', '-z+1/2, y, -x+1/2', 'z, -y+1/2, -x+1/2', 'z, y, x'], ['x, x, z', '-x+1/2, -x+1/2, z', '-x+1/2, x, -z+1/2', 'x, -x+1/2, -z+1/2', 'z, x, x', 'z, -x+1/2, -x+1/2', '-z+1/2, -x+1/2, x', '-z+1/2, x, -x+1/2', 'x, z, x', '-x+1/2, z, -x+1/2', 'x, -z+1/2, -x+1/2', '-x+1/2, -z+1/2, x', 'x+1/2, x+1/2, -z', '-x, -x, -z', 'x+1/2, -x, z+1/2', '-x, x+1/2, z+1/2', 'x+1/2, z+1/2, -x', '-x, z+1/2, x+1/2', '-x, -z, -x', 'x+1/2, -z, x+1/2', 'z+1/2, x+1/2, -x', 'z+1/2, -x, x+1/2', '-z, x+1/2, x+1/2', '-z, -x, -x'], ['1/2, y, -y', '0, -y+1/2, -y', '0, y, y+1/2', '1/2, -y+1/2, y+1/2', '-y, 1/2, y', '-y, 0, -y+1/2', 'y+1/2, 0, y', 'y+1/2, 1/2, -y+1/2', 'y, -y, 1/2', '-y+1/2, -y, 0', 'y, y+1/2, 0', '-y+1/2, y+1/2, 1/2', '1/2, -y, y', '0, y+1/2, y', '0, -y, -y+1/2', '1/2, y+1/2, -y+1/2', 'y, 1/2, -y', 'y, 0, y+1/2', '-y+1/2, 0, -y', '-y+1/2, 1/2, y+1/2', '-y, y, 1/2', 'y+1/2, y, 0', '-y, -y+1/2, 0', 'y+1/2, -y+1/2, 1/2'], ['1/2, y, y+1/2', '0, -y+1/2, y+1/2', '0, y, -y', '1/2, -y+1/2, -y', 'y+1/2, 1/2, y', 'y+1/2, 0, -y+1/2', '-y, 0, y', '-y, 1/2, -y+1/2', 'y, y+1/2, 1/2', '-y+1/2, y+1/2, 0', 'y, -y, 0', '-y+1/2, -y, 1/2', '1/2, -y, -y+1/2', '0, y+1/2, -y+1/2', '0, -y, y', '1/2, y+1/2, y', '-y+1/2, 1/2, -y', '-y+1/2, 0, y+1/2', 'y, 0, -y', 'y, 1/2, y+1/2', '-y, -y+1/2, 1/2', 'y+1/2, -y+1/2, 0', '-y, y, 0', 'y+1/2, y, 1/2'], ['x, 1/4, 3/4', '-x+1/2, 1/4, 3/4', '3/4, x, 1/4', '3/4, -x+1/2, 1/4', '1/4, 3/4, x', '1/4, 3/4, -x+1/2', '3/4, x+1/2, 1/4', '3/4, -x, 1/4', 'x+1/2, 1/4, 3/4', '-x, 1/4, 3/4', '1/4, 3/4, -x', '1/4, 3/4, x+1/2', '-x, 3/4, 1/4', 'x+1/2, 3/4, 1/4', '1/4, -x, 3/4', '1/4, x+1/2, 3/4', '3/4, 1/4, -x', '3/4, 1/4, x+1/2', '1/4, -x+1/2, 3/4', '1/4, x, 3/4', '-x+1/2, 3/4, 1/4', 'x, 3/4, 1/4', '3/4, 1/4, x', '3/4, 1/4, -x+1/2'], ['x, 1/4, 1/4', '-x+1/2, 1/4, 1/4', '1/4, x, 1/4', '1/4, -x+1/2, 1/4', '1/4, 1/4, x', '1/4, 1/4, -x+1/2', '3/4, x+1/2, 3/4', '3/4, -x, 3/4', 'x+1/2, 3/4, 3/4', '-x, 3/4, 3/4', '3/4, 3/4, -x', '3/4, 3/4, x+1/2'], ['1/2, 1/4, 3/4', '0, 1/4, 3/4', '3/4, 1/2, 1/4', '3/4, 0, 1/4', '1/4, 3/4, 1/2', '1/4, 3/4, 0', '1/2, 3/4, 1/4', '0, 3/4, 1/4', '1/4, 1/2, 3/4', '1/4, 0, 3/4', '3/4, 1/4, 1/2', '3/4, 1/4, 0'], ['x, x, x', '-x+1/2, -x+1/2, x', '-x+1/2, x, -x+1/2', 'x, -x+1/2, -x+1/2', 'x+1/2, x+1/2, -x', '-x, -x, -x', 'x+1/2, -x, x+1/2', '-x, x+1/2, x+1/2'], ['1/4, 3/4, 3/4', '3/4, 1/4, 3/4', '3/4, 3/4, 1/4', '1/4, 3/4, 1/4', '3/4, 1/4, 1/4', '1/4, 1/4, 3/4'], ['1/2, 1/2, 1/2', '0, 0, 1/2', '0, 1/2, 0', '1/2, 0, 0'], ['0, 0, 0', '1/2, 1/2, 0', '1/2, 0, 1/2', '0, 1/2, 1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4']]" +225,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, -z', '-y, -x, -z', 'y, -x, z', '-y, x, z', 'x, z, -y', '-x, z, y', '-x, -z, -y', 'x, -z, y', 'z, y, -x', 'z, -y, x', '-z, y, x', '-z, -y, -x', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', '-y, -x, z', 'y, x, z', '-y, x, -z', 'y, -x, -z', '-x, -z, y', 'x, -z, -y', 'x, z, y', '-x, z, -y', '-z, -y, x', '-z, y, -x', 'z, -y, -x', 'z, y, x', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', 'y, x+1/2, -z+1/2', '-y, -x+1/2, -z+1/2', 'y, -x+1/2, z+1/2', '-y, x+1/2, z+1/2', 'x, z+1/2, -y+1/2', '-x, z+1/2, y+1/2', '-x, -z+1/2, -y+1/2', 'x, -z+1/2, y+1/2', 'z, y+1/2, -x+1/2', 'z, -y+1/2, x+1/2', '-z, y+1/2, x+1/2', '-z, -y+1/2, -x+1/2', '-x, -y+1/2, -z+1/2', 'x, y+1/2, -z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2', '-z, -x+1/2, -y+1/2', '-z, x+1/2, y+1/2', 'z, x+1/2, -y+1/2', 'z, -x+1/2, y+1/2', '-y, -z+1/2, -x+1/2', 'y, -z+1/2, x+1/2', '-y, z+1/2, x+1/2', 'y, z+1/2, -x+1/2', '-y, -x+1/2, z+1/2', 'y, x+1/2, z+1/2', '-y, x+1/2, -z+1/2', 'y, -x+1/2, -z+1/2', '-x, -z+1/2, y+1/2', 'x, -z+1/2, -y+1/2', 'x, z+1/2, y+1/2', '-x, z+1/2, -y+1/2', '-z, -y+1/2, x+1/2', '-z, y+1/2, -x+1/2', 'z, -y+1/2, -x+1/2', 'z, y+1/2, x+1/2', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', 'y+1/2, x, -z+1/2', '-y+1/2, -x, -z+1/2', 'y+1/2, -x, z+1/2', '-y+1/2, x, z+1/2', 'x+1/2, z, -y+1/2', '-x+1/2, z, y+1/2', '-x+1/2, -z, -y+1/2', 'x+1/2, -z, y+1/2', 'z+1/2, y, -x+1/2', 'z+1/2, -y, x+1/2', '-z+1/2, y, x+1/2', '-z+1/2, -y, -x+1/2', '-x+1/2, -y, -z+1/2', 'x+1/2, y, -z+1/2', 'x+1/2, -y, z+1/2', '-x+1/2, y, z+1/2', '-z+1/2, -x, -y+1/2', '-z+1/2, x, y+1/2', 'z+1/2, x, -y+1/2', 'z+1/2, -x, y+1/2', '-y+1/2, -z, -x+1/2', 'y+1/2, -z, x+1/2', '-y+1/2, z, x+1/2', 'y+1/2, z, -x+1/2', '-y+1/2, -x, z+1/2', 'y+1/2, x, z+1/2', '-y+1/2, x, -z+1/2', 'y+1/2, -x, -z+1/2', '-x+1/2, -z, y+1/2', 'x+1/2, -z, -y+1/2', 'x+1/2, z, y+1/2', '-x+1/2, z, -y+1/2', '-z+1/2, -y, x+1/2', '-z+1/2, y, -x+1/2', 'z+1/2, -y, -x+1/2', 'z+1/2, y, x+1/2', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x', 'y+1/2, x+1/2, -z', '-y+1/2, -x+1/2, -z', 'y+1/2, -x+1/2, z', '-y+1/2, x+1/2, z', 'x+1/2, z+1/2, -y', '-x+1/2, z+1/2, y', '-x+1/2, -z+1/2, -y', 'x+1/2, -z+1/2, y', 'z+1/2, y+1/2, -x', 'z+1/2, -y+1/2, x', '-z+1/2, y+1/2, x', '-z+1/2, -y+1/2, -x', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-z+1/2, -x+1/2, -y', '-z+1/2, x+1/2, y', 'z+1/2, x+1/2, -y', 'z+1/2, -x+1/2, y', '-y+1/2, -z+1/2, -x', 'y+1/2, -z+1/2, x', '-y+1/2, z+1/2, x', 'y+1/2, z+1/2, -x', '-y+1/2, -x+1/2, z', 'y+1/2, x+1/2, z', '-y+1/2, x+1/2, -z', 'y+1/2, -x+1/2, -z', '-x+1/2, -z+1/2, y', 'x+1/2, -z+1/2, -y', 'x+1/2, z+1/2, y', '-x+1/2, z+1/2, -y', '-z+1/2, -y+1/2, x', '-z+1/2, y+1/2, -x', 'z+1/2, -y+1/2, -x', 'z+1/2, y+1/2, x'], ['x, x, z', '-x, -x, z', '-x, x, -z', 'x, -x, -z', 'z, x, x', 'z, -x, -x', '-z, -x, x', '-z, x, -x', 'x, z, x', '-x, z, -x', 'x, -z, -x', '-x, -z, x', 'x, x, -z', '-x, -x, -z', 'x, -x, z', '-x, x, z', 'x, z, -x', '-x, z, x', '-x, -z, -x', 'x, -z, x', 'z, x, -x', 'z, -x, x', '-z, x, x', '-z, -x, -x', 'x, x+1/2, z+1/2', '-x, -x+1/2, z+1/2', '-x, x+1/2, -z+1/2', 'x, -x+1/2, -z+1/2', 'z, x+1/2, x+1/2', 'z, -x+1/2, -x+1/2', '-z, -x+1/2, x+1/2', '-z, x+1/2, -x+1/2', 'x, z+1/2, x+1/2', '-x, z+1/2, -x+1/2', 'x, -z+1/2, -x+1/2', '-x, -z+1/2, x+1/2', 'x, x+1/2, -z+1/2', '-x, -x+1/2, -z+1/2', 'x, -x+1/2, z+1/2', '-x, x+1/2, z+1/2', 'x, z+1/2, -x+1/2', '-x, z+1/2, x+1/2', '-x, -z+1/2, -x+1/2', 'x, -z+1/2, x+1/2', 'z, x+1/2, -x+1/2', 'z, -x+1/2, x+1/2', '-z, x+1/2, x+1/2', '-z, -x+1/2, -x+1/2', 'x+1/2, x, z+1/2', '-x+1/2, -x, z+1/2', '-x+1/2, x, -z+1/2', 'x+1/2, -x, -z+1/2', 'z+1/2, x, x+1/2', 'z+1/2, -x, -x+1/2', '-z+1/2, -x, x+1/2', '-z+1/2, x, -x+1/2', 'x+1/2, z, x+1/2', '-x+1/2, z, -x+1/2', 'x+1/2, -z, -x+1/2', '-x+1/2, -z, x+1/2', 'x+1/2, x, -z+1/2', '-x+1/2, -x, -z+1/2', 'x+1/2, -x, z+1/2', '-x+1/2, x, z+1/2', 'x+1/2, z, -x+1/2', '-x+1/2, z, x+1/2', '-x+1/2, -z, -x+1/2', 'x+1/2, -z, x+1/2', 'z+1/2, x, -x+1/2', 'z+1/2, -x, x+1/2', '-z+1/2, x, x+1/2', '-z+1/2, -x, -x+1/2', 'x+1/2, x+1/2, z', '-x+1/2, -x+1/2, z', '-x+1/2, x+1/2, -z', 'x+1/2, -x+1/2, -z', 'z+1/2, x+1/2, x', 'z+1/2, -x+1/2, -x', '-z+1/2, -x+1/2, x', '-z+1/2, x+1/2, -x', 'x+1/2, z+1/2, x', '-x+1/2, z+1/2, -x', 'x+1/2, -z+1/2, -x', '-x+1/2, -z+1/2, x', 'x+1/2, x+1/2, -z', '-x+1/2, -x+1/2, -z', 'x+1/2, -x+1/2, z', '-x+1/2, x+1/2, z', 'x+1/2, z+1/2, -x', '-x+1/2, z+1/2, x', '-x+1/2, -z+1/2, -x', 'x+1/2, -z+1/2, x', 'z+1/2, x+1/2, -x', 'z+1/2, -x+1/2, x', '-z+1/2, x+1/2, x', '-z+1/2, -x+1/2, -x'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', 'y, 0, -z', '-y, 0, -z', 'y, 0, z', '-y, 0, z', '0, z, -y', '0, z, y', '0, -z, -y', '0, -z, y', 'z, y, 0', 'z, -y, 0', '-z, y, 0', '-z, -y, 0', '0, y+1/2, z+1/2', '0, -y+1/2, z+1/2', '0, y+1/2, -z+1/2', '0, -y+1/2, -z+1/2', 'z, 1/2, y+1/2', 'z, 1/2, -y+1/2', '-z, 1/2, y+1/2', '-z, 1/2, -y+1/2', 'y, z+1/2, 1/2', '-y, z+1/2, 1/2', 'y, -z+1/2, 1/2', '-y, -z+1/2, 1/2', 'y, 1/2, -z+1/2', '-y, 1/2, -z+1/2', 'y, 1/2, z+1/2', '-y, 1/2, z+1/2', '0, z+1/2, -y+1/2', '0, z+1/2, y+1/2', '0, -z+1/2, -y+1/2', '0, -z+1/2, y+1/2', 'z, y+1/2, 1/2', 'z, -y+1/2, 1/2', '-z, y+1/2, 1/2', '-z, -y+1/2, 1/2', '1/2, y, z+1/2', '1/2, -y, z+1/2', '1/2, y, -z+1/2', '1/2, -y, -z+1/2', 'z+1/2, 0, y+1/2', 'z+1/2, 0, -y+1/2', '-z+1/2, 0, y+1/2', '-z+1/2, 0, -y+1/2', 'y+1/2, z, 1/2', '-y+1/2, z, 1/2', 'y+1/2, -z, 1/2', '-y+1/2, -z, 1/2', 'y+1/2, 0, -z+1/2', '-y+1/2, 0, -z+1/2', 'y+1/2, 0, z+1/2', '-y+1/2, 0, z+1/2', '1/2, z, -y+1/2', '1/2, z, y+1/2', '1/2, -z, -y+1/2', '1/2, -z, y+1/2', 'z+1/2, y, 1/2', 'z+1/2, -y, 1/2', '-z+1/2, y, 1/2', '-z+1/2, -y, 1/2', '1/2, y+1/2, z', '1/2, -y+1/2, z', '1/2, y+1/2, -z', '1/2, -y+1/2, -z', 'z+1/2, 1/2, y', 'z+1/2, 1/2, -y', '-z+1/2, 1/2, y', '-z+1/2, 1/2, -y', 'y+1/2, z+1/2, 0', '-y+1/2, z+1/2, 0', 'y+1/2, -z+1/2, 0', '-y+1/2, -z+1/2, 0', 'y+1/2, 1/2, -z', '-y+1/2, 1/2, -z', 'y+1/2, 1/2, z', '-y+1/2, 1/2, z', '1/2, z+1/2, -y', '1/2, z+1/2, y', '1/2, -z+1/2, -y', '1/2, -z+1/2, y', 'z+1/2, y+1/2, 0', 'z+1/2, -y+1/2, 0', '-z+1/2, y+1/2, 0', '-z+1/2, -y+1/2, 0'], ['1/2, y, y', '1/2, -y, y', '1/2, y, -y', '1/2, -y, -y', 'y, 1/2, y', 'y, 1/2, -y', '-y, 1/2, y', '-y, 1/2, -y', 'y, y, 1/2', '-y, y, 1/2', 'y, -y, 1/2', '-y, -y, 1/2', '1/2, y+1/2, y+1/2', '1/2, -y+1/2, y+1/2', '1/2, y+1/2, -y+1/2', '1/2, -y+1/2, -y+1/2', 'y, 1, y+1/2', 'y, 1, -y+1/2', '-y, 1, y+1/2', '-y, 1, -y+1/2', 'y, y+1/2, 1', '-y, y+1/2, 1', 'y, -y+1/2, 1', '-y, -y+1/2, 1', '1, y, y+1/2', '1, -y, y+1/2', '1, y, -y+1/2', '1, -y, -y+1/2', 'y+1/2, 1/2, y+1/2', 'y+1/2, 1/2, -y+1/2', '-y+1/2, 1/2, y+1/2', '-y+1/2, 1/2, -y+1/2', 'y+1/2, y, 1', '-y+1/2, y, 1', 'y+1/2, -y, 1', '-y+1/2, -y, 1', '1, y+1/2, y', '1, -y+1/2, y', '1, y+1/2, -y', '1, -y+1/2, -y', 'y+1/2, 1, y', 'y+1/2, 1, -y', '-y+1/2, 1, y', '-y+1/2, 1, -y', 'y+1/2, y+1/2, 1/2', '-y+1/2, y+1/2, 1/2', 'y+1/2, -y+1/2, 1/2', '-y+1/2, -y+1/2, 1/2'], ['0, y, y', '0, -y, y', '0, y, -y', '0, -y, -y', 'y, 0, y', 'y, 0, -y', '-y, 0, y', '-y, 0, -y', 'y, y, 0', '-y, y, 0', 'y, -y, 0', '-y, -y, 0', '0, y+1/2, y+1/2', '0, -y+1/2, y+1/2', '0, y+1/2, -y+1/2', '0, -y+1/2, -y+1/2', 'y, 1/2, y+1/2', 'y, 1/2, -y+1/2', '-y, 1/2, y+1/2', '-y, 1/2, -y+1/2', 'y, y+1/2, 1/2', '-y, y+1/2, 1/2', 'y, -y+1/2, 1/2', '-y, -y+1/2, 1/2', '1/2, y, y+1/2', '1/2, -y, y+1/2', '1/2, y, -y+1/2', '1/2, -y, -y+1/2', 'y+1/2, 0, y+1/2', 'y+1/2, 0, -y+1/2', '-y+1/2, 0, y+1/2', '-y+1/2, 0, -y+1/2', 'y+1/2, y, 1/2', '-y+1/2, y, 1/2', 'y+1/2, -y, 1/2', '-y+1/2, -y, 1/2', '1/2, y+1/2, y', '1/2, -y+1/2, y', '1/2, y+1/2, -y', '1/2, -y+1/2, -y', 'y+1/2, 1/2, y', 'y+1/2, 1/2, -y', '-y+1/2, 1/2, y', '-y+1/2, 1/2, -y', 'y+1/2, y+1/2, 0', '-y+1/2, y+1/2, 0', 'y+1/2, -y+1/2, 0', '-y+1/2, -y+1/2, 0'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', '1/4, x, 3/4', '3/4, -x, 3/4', 'x, 1/4, 3/4', '-x, 1/4, 1/4', '1/4, 1/4, -x', '1/4, 3/4, x', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', '1/4, x+1/2, 5/4', '3/4, -x+1/2, 5/4', 'x, 3/4, 5/4', '-x, 3/4, 3/4', '1/4, 3/4, -x+1/2', '1/4, 5/4, x+1/2', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', '3/4, x, 5/4', '5/4, -x, 5/4', 'x+1/2, 1/4, 5/4', '-x+1/2, 1/4, 3/4', '3/4, 1/4, -x+1/2', '3/4, 3/4, x+1/2', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x', '3/4, x+1/2, 3/4', '5/4, -x+1/2, 3/4', 'x+1/2, 3/4, 3/4', '-x+1/2, 3/4, 1/4', '3/4, 3/4, -x', '3/4, 5/4, x'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x, -x', '-x, -x, -x', 'x, -x, x', '-x, x, x', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', 'x, x+1/2, -x+1/2', '-x, -x+1/2, -x+1/2', 'x, -x+1/2, x+1/2', '-x, x+1/2, x+1/2', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', 'x+1/2, x, -x+1/2', '-x+1/2, -x, -x+1/2', 'x+1/2, -x, x+1/2', '-x+1/2, x, x+1/2', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x', 'x+1/2, x+1/2, -x', '-x+1/2, -x+1/2, -x', 'x+1/2, -x+1/2, x', '-x+1/2, x+1/2, x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x'], ['0, 1/4, 1/4', '0, 3/4, 1/4', '1/4, 0, 1/4', '1/4, 0, 3/4', '1/4, 1/4, 0', '3/4, 1/4, 0', '0, 3/4, 3/4', '0, 5/4, 3/4', '1/4, 1/2, 3/4', '1/4, 1/2, 5/4', '1/4, 3/4, 1/2', '3/4, 3/4, 1/2', '1/2, 1/4, 3/4', '1/2, 3/4, 3/4', '3/4, 0, 3/4', '3/4, 0, 5/4', '3/4, 1/4, 1/2', '5/4, 1/4, 1/2', '1/2, 3/4, 1/4', '1/2, 5/4, 1/4', '3/4, 1/2, 1/4', '3/4, 1/2, 3/4', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['1/4, 1/4, 1/4', '1/4, 1/4, 3/4', '1/4, 3/4, 3/4', '1/4, 3/4, 5/4', '3/4, 1/4, 3/4', '3/4, 1/4, 5/4', '3/4, 3/4, 1/4', '3/4, 3/4, 3/4'], ['1/2, 1/2, 1/2', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0']]" +226,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', 'y+1/2, -x+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'x+1/2, z+1/2, -y+1/2', '-x+1/2, z+1/2, y+1/2', '-x+1/2, -z+1/2, -y+1/2', 'x+1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, x+1/2', '-z+1/2, -y+1/2, -x+1/2', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2', '-y+1/2, x+1/2, -z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-x+1/2, -z+1/2, y+1/2', 'x+1/2, -z+1/2, -y+1/2', 'x+1/2, z+1/2, y+1/2', '-x+1/2, z+1/2, -y+1/2', '-z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, -x+1/2', 'z+1/2, y+1/2, x+1/2', 'x, y+1/2, z+1/2', '-x, -y+1/2, z+1/2', '-x, y+1/2, -z+1/2', 'x, -y+1/2, -z+1/2', 'z, x+1/2, y+1/2', 'z, -x+1/2, -y+1/2', '-z, -x+1/2, y+1/2', '-z, x+1/2, -y+1/2', 'y, z+1/2, x+1/2', '-y, z+1/2, -x+1/2', 'y, -z+1/2, -x+1/2', '-y, -z+1/2, x+1/2', 'y+1/2, x+1, -z+1', '-y+1/2, -x+1, -z+1', 'y+1/2, -x+1, z+1', '-y+1/2, x+1, z+1', 'x+1/2, z+1, -y+1', '-x+1/2, z+1, y+1', '-x+1/2, -z+1, -y+1', 'x+1/2, -z+1, y+1', 'z+1/2, y+1, -x+1', 'z+1/2, -y+1, x+1', '-z+1/2, y+1, x+1', '-z+1/2, -y+1, -x+1', '-x, -y+1/2, -z+1/2', 'x, y+1/2, -z+1/2', 'x, -y+1/2, z+1/2', '-x, y+1/2, z+1/2', '-z, -x+1/2, -y+1/2', '-z, x+1/2, y+1/2', 'z, x+1/2, -y+1/2', 'z, -x+1/2, y+1/2', '-y, -z+1/2, -x+1/2', 'y, -z+1/2, x+1/2', '-y, z+1/2, x+1/2', 'y, z+1/2, -x+1/2', '-y+1/2, -x+1, z+1', 'y+1/2, x+1, z+1', '-y+1/2, x+1, -z+1', 'y+1/2, -x+1, -z+1', '-x+1/2, -z+1, y+1', 'x+1/2, -z+1, -y+1', 'x+1/2, z+1, y+1', '-x+1/2, z+1, -y+1', '-z+1/2, -y+1, x+1', '-z+1/2, y+1, -x+1', 'z+1/2, -y+1, -x+1', 'z+1/2, y+1, x+1', 'x+1/2, y, z+1/2', '-x+1/2, -y, z+1/2', '-x+1/2, y, -z+1/2', 'x+1/2, -y, -z+1/2', 'z+1/2, x, y+1/2', 'z+1/2, -x, -y+1/2', '-z+1/2, -x, y+1/2', '-z+1/2, x, -y+1/2', 'y+1/2, z, x+1/2', '-y+1/2, z, -x+1/2', 'y+1/2, -z, -x+1/2', '-y+1/2, -z, x+1/2', 'y+1, x+1/2, -z+1', '-y+1, -x+1/2, -z+1', 'y+1, -x+1/2, z+1', '-y+1, x+1/2, z+1', 'x+1, z+1/2, -y+1', '-x+1, z+1/2, y+1', '-x+1, -z+1/2, -y+1', 'x+1, -z+1/2, y+1', 'z+1, y+1/2, -x+1', 'z+1, -y+1/2, x+1', '-z+1, y+1/2, x+1', '-z+1, -y+1/2, -x+1', '-x+1/2, -y, -z+1/2', 'x+1/2, y, -z+1/2', 'x+1/2, -y, z+1/2', '-x+1/2, y, z+1/2', '-z+1/2, -x, -y+1/2', '-z+1/2, x, y+1/2', 'z+1/2, x, -y+1/2', 'z+1/2, -x, y+1/2', '-y+1/2, -z, -x+1/2', 'y+1/2, -z, x+1/2', '-y+1/2, z, x+1/2', 'y+1/2, z, -x+1/2', '-y+1, -x+1/2, z+1', 'y+1, x+1/2, z+1', '-y+1, x+1/2, -z+1', 'y+1, -x+1/2, -z+1', '-x+1, -z+1/2, y+1', 'x+1, -z+1/2, -y+1', 'x+1, z+1/2, y+1', '-x+1, z+1/2, -y+1', '-z+1, -y+1/2, x+1', '-z+1, y+1/2, -x+1', 'z+1, -y+1/2, -x+1', 'z+1, y+1/2, x+1', 'x+1/2, y+1/2, z', '-x+1/2, -y+1/2, z', '-x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, -z', 'z+1/2, x+1/2, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x+1/2, y', '-z+1/2, x+1/2, -y', 'y+1/2, z+1/2, x', '-y+1/2, z+1/2, -x', 'y+1/2, -z+1/2, -x', '-y+1/2, -z+1/2, x', 'y+1, x+1, -z+1/2', '-y+1, -x+1, -z+1/2', 'y+1, -x+1, z+1/2', '-y+1, x+1, z+1/2', 'x+1, z+1, -y+1/2', '-x+1, z+1, y+1/2', '-x+1, -z+1, -y+1/2', 'x+1, -z+1, y+1/2', 'z+1, y+1, -x+1/2', 'z+1, -y+1, x+1/2', '-z+1, y+1, x+1/2', '-z+1, -y+1, -x+1/2', '-x+1/2, -y+1/2, -z', 'x+1/2, y+1/2, -z', 'x+1/2, -y+1/2, z', '-x+1/2, y+1/2, z', '-z+1/2, -x+1/2, -y', '-z+1/2, x+1/2, y', 'z+1/2, x+1/2, -y', 'z+1/2, -x+1/2, y', '-y+1/2, -z+1/2, -x', 'y+1/2, -z+1/2, x', '-y+1/2, z+1/2, x', 'y+1/2, z+1/2, -x', '-y+1, -x+1, z+1/2', 'y+1, x+1, z+1/2', '-y+1, x+1, -z+1/2', 'y+1, -x+1, -z+1/2', '-x+1, -z+1, y+1/2', 'x+1, -z+1, -y+1/2', 'x+1, z+1, y+1/2', '-x+1, z+1, -y+1/2', '-z+1, -y+1, x+1/2', '-z+1, y+1, -x+1/2', 'z+1, -y+1, -x+1/2', 'z+1, y+1, x+1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', 'y+1/2, 1/2, -z+1/2', '-y+1/2, 1/2, -z+1/2', 'y+1/2, 1/2, z+1/2', '-y+1/2, 1/2, z+1/2', '1/2, z+1/2, -y+1/2', '1/2, z+1/2, y+1/2', '1/2, -z+1/2, -y+1/2', '1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, 1/2', 'z+1/2, -y+1/2, 1/2', '-z+1/2, y+1/2, 1/2', '-z+1/2, -y+1/2, 1/2', '0, y+1/2, z+1/2', '0, -y+1/2, z+1/2', '0, y+1/2, -z+1/2', '0, -y+1/2, -z+1/2', 'z, 1/2, y+1/2', 'z, 1/2, -y+1/2', '-z, 1/2, y+1/2', '-z, 1/2, -y+1/2', 'y, z+1/2, 1/2', '-y, z+1/2, 1/2', 'y, -z+1/2, 1/2', '-y, -z+1/2, 1/2', 'y+1/2, 1, -z+1', '-y+1/2, 1, -z+1', 'y+1/2, 1, z+1', '-y+1/2, 1, z+1', '1/2, z+1, -y+1', '1/2, z+1, y+1', '1/2, -z+1, -y+1', '1/2, -z+1, y+1', 'z+1/2, y+1, 1', 'z+1/2, -y+1, 1', '-z+1/2, y+1, 1', '-z+1/2, -y+1, 1', '1/2, y, z+1/2', '1/2, -y, z+1/2', '1/2, y, -z+1/2', '1/2, -y, -z+1/2', 'z+1/2, 0, y+1/2', 'z+1/2, 0, -y+1/2', '-z+1/2, 0, y+1/2', '-z+1/2, 0, -y+1/2', 'y+1/2, z, 1/2', '-y+1/2, z, 1/2', 'y+1/2, -z, 1/2', '-y+1/2, -z, 1/2', 'y+1, 1/2, -z+1', '-y+1, 1/2, -z+1', 'y+1, 1/2, z+1', '-y+1, 1/2, z+1', '1, z+1/2, -y+1', '1, z+1/2, y+1', '1, -z+1/2, -y+1', '1, -z+1/2, y+1', 'z+1, y+1/2, 1', 'z+1, -y+1/2, 1', '-z+1, y+1/2, 1', '-z+1, -y+1/2, 1', '1/2, y+1/2, z', '1/2, -y+1/2, z', '1/2, y+1/2, -z', '1/2, -y+1/2, -z', 'z+1/2, 1/2, y', 'z+1/2, 1/2, -y', '-z+1/2, 1/2, y', '-z+1/2, 1/2, -y', 'y+1/2, z+1/2, 0', '-y+1/2, z+1/2, 0', 'y+1/2, -z+1/2, 0', '-y+1/2, -z+1/2, 0', 'y+1, 1, -z+1/2', '-y+1, 1, -z+1/2', 'y+1, 1, z+1/2', '-y+1, 1, z+1/2', '1, z+1, -y+1/2', '1, z+1, y+1/2', '1, -z+1, -y+1/2', '1, -z+1, y+1/2', 'z+1, y+1, 1/2', 'z+1, -y+1, 1/2', '-z+1, y+1, 1/2', '-z+1, -y+1, 1/2'], ['1/4, y, y', '3/4, -y, y', '3/4, y, -y', '1/4, -y, -y', 'y, 1/4, y', 'y, 3/4, -y', '-y, 3/4, y', '-y, 1/4, -y', 'y, y, 1/4', '-y, y, 3/4', 'y, -y, 3/4', '-y, -y, 1/4', '3/4, -y, -y', '1/4, y, -y', '1/4, -y, y', '3/4, y, y', '-y, 3/4, -y', '-y, 1/4, y', 'y, 1/4, -y', 'y, 3/4, y', '-y, -y, 3/4', 'y, -y, 1/4', '-y, y, 1/4', 'y, y, 3/4', '1/4, y+1/2, y+1/2', '3/4, -y+1/2, y+1/2', '3/4, y+1/2, -y+1/2', '1/4, -y+1/2, -y+1/2', 'y, 3/4, y+1/2', 'y, 5/4, -y+1/2', '-y, 5/4, y+1/2', '-y, 3/4, -y+1/2', 'y, y+1/2, 3/4', '-y, y+1/2, 5/4', 'y, -y+1/2, 5/4', '-y, -y+1/2, 3/4', '3/4, -y+1/2, -y+1/2', '1/4, y+1/2, -y+1/2', '1/4, -y+1/2, y+1/2', '3/4, y+1/2, y+1/2', '-y, 5/4, -y+1/2', '-y, 3/4, y+1/2', 'y, 3/4, -y+1/2', 'y, 5/4, y+1/2', '-y, -y+1/2, 5/4', 'y, -y+1/2, 3/4', '-y, y+1/2, 3/4', 'y, y+1/2, 5/4', '3/4, y, y+1/2', '5/4, -y, y+1/2', '5/4, y, -y+1/2', '3/4, -y, -y+1/2', 'y+1/2, 1/4, y+1/2', 'y+1/2, 3/4, -y+1/2', '-y+1/2, 3/4, y+1/2', '-y+1/2, 1/4, -y+1/2', 'y+1/2, y, 3/4', '-y+1/2, y, 5/4', 'y+1/2, -y, 5/4', '-y+1/2, -y, 3/4', '5/4, -y, -y+1/2', '3/4, y, -y+1/2', '3/4, -y, y+1/2', '5/4, y, y+1/2', '-y+1/2, 3/4, -y+1/2', '-y+1/2, 1/4, y+1/2', 'y+1/2, 1/4, -y+1/2', 'y+1/2, 3/4, y+1/2', '-y+1/2, -y, 5/4', 'y+1/2, -y, 3/4', '-y+1/2, y, 3/4', 'y+1/2, y, 5/4', '3/4, y+1/2, y', '5/4, -y+1/2, y', '5/4, y+1/2, -y', '3/4, -y+1/2, -y', 'y+1/2, 3/4, y', 'y+1/2, 5/4, -y', '-y+1/2, 5/4, y', '-y+1/2, 3/4, -y', 'y+1/2, y+1/2, 1/4', '-y+1/2, y+1/2, 3/4', 'y+1/2, -y+1/2, 3/4', '-y+1/2, -y+1/2, 1/4', '5/4, -y+1/2, -y', '3/4, y+1/2, -y', '3/4, -y+1/2, y', '5/4, y+1/2, y', '-y+1/2, 5/4, -y', '-y+1/2, 3/4, y', 'y+1/2, 3/4, -y', 'y+1/2, 5/4, y', '-y+1/2, -y+1/2, 3/4', 'y+1/2, -y+1/2, 1/4', '-y+1/2, y+1/2, 1/4', 'y+1/2, y+1/2, 3/4'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x+1/2, x+1/2, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, x+1/2', '-x, -x, -x', 'x, x, -x', 'x, -x, x', '-x, x, x', '-x+1/2, -x+1/2, x+1/2', 'x+1/2, x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2', 'x, x+1/2, x+1/2', '-x, -x+1/2, x+1/2', '-x, x+1/2, -x+1/2', 'x, -x+1/2, -x+1/2', 'x+1/2, x+1, -x+1', '-x+1/2, -x+1, -x+1', 'x+1/2, -x+1, x+1', '-x+1/2, x+1, x+1', '-x, -x+1/2, -x+1/2', 'x, x+1/2, -x+1/2', 'x, -x+1/2, x+1/2', '-x, x+1/2, x+1/2', '-x+1/2, -x+1, x+1', 'x+1/2, x+1, x+1', '-x+1/2, x+1, -x+1', 'x+1/2, -x+1, -x+1', 'x+1/2, x, x+1/2', '-x+1/2, -x, x+1/2', '-x+1/2, x, -x+1/2', 'x+1/2, -x, -x+1/2', 'x+1, x+1/2, -x+1', '-x+1, -x+1/2, -x+1', 'x+1, -x+1/2, x+1', '-x+1, x+1/2, x+1', '-x+1/2, -x, -x+1/2', 'x+1/2, x, -x+1/2', 'x+1/2, -x, x+1/2', '-x+1/2, x, x+1/2', '-x+1, -x+1/2, x+1', 'x+1, x+1/2, x+1', '-x+1, x+1/2, -x+1', 'x+1, -x+1/2, -x+1', 'x+1/2, x+1/2, x', '-x+1/2, -x+1/2, x', '-x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, -x', 'x+1, x+1, -x+1/2', '-x+1, -x+1, -x+1/2', 'x+1, -x+1, x+1/2', '-x+1, x+1, x+1/2', '-x+1/2, -x+1/2, -x', 'x+1/2, x+1/2, -x', 'x+1/2, -x+1/2, x', '-x+1/2, x+1/2, x', '-x+1, -x+1, x+1/2', 'x+1, x+1, x+1/2', '-x+1, x+1, -x+1/2', 'x+1, -x+1, -x+1/2'], ['x, 1/4, 1/4', '-x, 3/4, 1/4', '1/4, x, 1/4', '1/4, -x, 3/4', '1/4, 1/4, x', '3/4, 1/4, -x', '-x, 3/4, 3/4', 'x, 1/4, 3/4', '3/4, -x, 3/4', '3/4, x, 1/4', '3/4, 3/4, -x', '1/4, 3/4, x', 'x, 3/4, 3/4', '-x, 5/4, 3/4', '1/4, x+1/2, 3/4', '1/4, -x+1/2, 5/4', '1/4, 3/4, x+1/2', '3/4, 3/4, -x+1/2', '-x, 5/4, 5/4', 'x, 3/4, 5/4', '3/4, -x+1/2, 5/4', '3/4, x+1/2, 3/4', '3/4, 5/4, -x+1/2', '1/4, 5/4, x+1/2', 'x+1/2, 1/4, 3/4', '-x+1/2, 3/4, 3/4', '3/4, x, 3/4', '3/4, -x, 5/4', '3/4, 1/4, x+1/2', '5/4, 1/4, -x+1/2', '-x+1/2, 3/4, 5/4', 'x+1/2, 1/4, 5/4', '5/4, -x, 5/4', '5/4, x, 3/4', '5/4, 3/4, -x+1/2', '3/4, 3/4, x+1/2', 'x+1/2, 3/4, 1/4', '-x+1/2, 5/4, 1/4', '3/4, x+1/2, 1/4', '3/4, -x+1/2, 3/4', '3/4, 3/4, x', '5/4, 3/4, -x', '-x+1/2, 5/4, 3/4', 'x+1/2, 3/4, 3/4', '5/4, -x+1/2, 3/4', '5/4, x+1/2, 1/4', '5/4, 5/4, -x', '3/4, 5/4, x'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, 1/2, -x+1/2', '1/2, 1/2, x+1/2', 'x, 1/2, 1/2', '-x, 1/2, 1/2', '0, x+1/2, 1/2', '0, -x+1/2, 1/2', '0, 1/2, x+1/2', '0, 1/2, -x+1/2', '1/2, x+1, 1', '1/2, -x+1, 1', 'x+1/2, 1, 1', '-x+1/2, 1, 1', '1/2, 1, -x+1', '1/2, 1, x+1', 'x+1/2, 0, 1/2', '-x+1/2, 0, 1/2', '1/2, x, 1/2', '1/2, -x, 1/2', '1/2, 0, x+1/2', '1/2, 0, -x+1/2', '1, x+1/2, 1', '1, -x+1/2, 1', 'x+1, 1/2, 1', '-x+1, 1/2, 1', '1, 1/2, -x+1', '1, 1/2, x+1', 'x+1/2, 1/2, 0', '-x+1/2, 1/2, 0', '1/2, x+1/2, 0', '1/2, -x+1/2, 0', '1/2, 1/2, x', '1/2, 1/2, -x', '1, x+1, 1/2', '1, -x+1, 1/2', 'x+1, 1, 1/2', '-x+1, 1, 1/2', '1, 1, -x+1/2', '1, 1, x+1/2'], ['0, 1/4, 1/4', '0, 3/4, 1/4', '1/4, 0, 1/4', '1/4, 0, 3/4', '1/4, 1/4, 0', '3/4, 1/4, 0', '0, 3/4, 3/4', '0, 5/4, 3/4', '1/4, 1/2, 3/4', '1/4, 1/2, 5/4', '1/4, 3/4, 1/2', '3/4, 3/4, 1/2', '1/2, 1/4, 3/4', '1/2, 3/4, 3/4', '3/4, 0, 3/4', '3/4, 0, 5/4', '3/4, 1/4, 1/2', '5/4, 1/4, 1/2', '1/2, 3/4, 1/4', '1/2, 5/4, 1/4', '3/4, 1/2, 1/4', '3/4, 1/2, 3/4', '3/4, 3/4, 0', '5/4, 3/4, 0'], ['1/4, 0, 0', '3/4, 0, 0', '0, 1/4, 0', '0, 3/4, 0', '0, 0, 1/4', '0, 0, 3/4', '1/4, 1/2, 1/2', '3/4, 1/2, 1/2', '0, 3/4, 1/2', '0, 5/4, 1/2', '0, 1/2, 3/4', '0, 1/2, 5/4', '3/4, 0, 1/2', '5/4, 0, 1/2', '1/2, 1/4, 1/2', '1/2, 3/4, 1/2', '1/2, 0, 3/4', '1/2, 0, 5/4', '3/4, 1/2, 0', '5/4, 1/2, 0', '1/2, 3/4, 0', '1/2, 5/4, 0', '1/2, 1/2, 1/4', '1/2, 1/2, 3/4'], ['0, 0, 0', '1/2, 1/2, 1/2', '0, 1/2, 1/2', '1/2, 1, 1', '1/2, 0, 1/2', '1, 1/2, 1', '1/2, 1/2, 0', '1, 1, 1/2'], ['1/4, 1/4, 1/4', '3/4, 3/4, 3/4', '1/4, 3/4, 3/4', '3/4, 5/4, 5/4', '3/4, 1/4, 3/4', '5/4, 3/4, 5/4', '3/4, 3/4, 1/4', '5/4, 5/4, 3/4']]" +227,"[['x, y, z', '-x+3/4, -y+1/4, z+1/2', '-x+1/4, y+1/2, -z+3/4', 'x+1/2, -y+3/4, -z+1/4', 'z, x, y', 'z+1/2, -x+3/4, -y+1/4', '-z+3/4, -x+1/4, y+1/2', '-z+1/4, x+1/2, -y+3/4', 'y, z, x', '-y+1/4, z+1/2, -x+3/4', 'y+1/2, -z+3/4, -x+1/4', '-y+3/4, -z+1/4, x+1/2', 'y+3/4, x+1/4, -z+1/2', '-y, -x, -z', 'y+1/4, -x+1/2, z+3/4', '-y+1/2, x+3/4, z+1/4', 'x+3/4, z+1/4, -y+1/2', '-x+1/2, z+3/4, y+1/4', '-x, -z, -y', 'x+1/4, -z+1/2, y+3/4', 'z+3/4, y+1/4, -x+1/2', 'z+1/4, -y+1/2, x+3/4', '-z+1/2, y+3/4, x+1/4', '-z, -y, -x', '-x, -y, -z', 'x+1/4, y+3/4, -z+1/2', 'x+3/4, -y+1/2, z+1/4', '-x+1/2, y+1/4, z+3/4', '-z, -x, -y', '-z+1/2, x+1/4, y+3/4', 'z+1/4, x+3/4, -y+1/2', 'z+3/4, -x+1/2, y+1/4', '-y, -z, -x', 'y+3/4, -z+1/2, x+1/4', '-y+1/2, z+1/4, x+3/4', 'y+1/4, z+3/4, -x+1/2', '-y+1/4, -x+3/4, z+1/2', 'y, x, z', '-y+3/4, x+1/2, -z+1/4', 'y+1/2, -x+1/4, -z+3/4', '-x+1/4, -z+3/4, y+1/2', 'x+1/2, -z+1/4, -y+3/4', 'x, z, y', '-x+3/4, z+1/2, -y+1/4', '-z+1/4, -y+3/4, x+1/2', '-z+3/4, y+1/2, -x+1/4', 'z+1/2, -y+1/4, -x+3/4', 'z, y, x', 'x, y+1/2, z+1/2', '-x+3/4, -y+3/4, z+1', '-x+1/4, y+1, -z+5/4', 'x+1/2, -y+5/4, -z+3/4', 'z, x+1/2, y+1/2', 'z+1/2, -x+5/4, -y+3/4', '-z+3/4, -x+3/4, y+1', '-z+1/4, x+1, -y+5/4', 'y, z+1/2, x+1/2', '-y+1/4, z+1, -x+5/4', 'y+1/2, -z+5/4, -x+3/4', '-y+3/4, -z+3/4, x+1', 'y+3/4, x+3/4, -z+1', '-y, -x+1/2, -z+1/2', 'y+1/4, -x+1, z+5/4', '-y+1/2, x+5/4, z+3/4', 'x+3/4, z+3/4, -y+1', '-x+1/2, z+5/4, y+3/4', '-x, -z+1/2, -y+1/2', 'x+1/4, -z+1, y+5/4', 'z+3/4, y+3/4, -x+1', 'z+1/4, -y+1, x+5/4', '-z+1/2, y+5/4, x+3/4', '-z, -y+1/2, -x+1/2', '-x, -y+1/2, -z+1/2', 'x+1/4, y+5/4, -z+1', 'x+3/4, -y+1, z+3/4', '-x+1/2, y+3/4, z+5/4', '-z, -x+1/2, -y+1/2', '-z+1/2, x+3/4, y+5/4', 'z+1/4, x+5/4, -y+1', 'z+3/4, -x+1, y+3/4', '-y, -z+1/2, -x+1/2', 'y+3/4, -z+1, x+3/4', '-y+1/2, z+3/4, x+5/4', 'y+1/4, z+5/4, -x+1', '-y+1/4, -x+5/4, z+1', 'y, x+1/2, z+1/2', '-y+3/4, x+1, -z+3/4', 'y+1/2, -x+3/4, -z+5/4', '-x+1/4, -z+5/4, y+1', 'x+1/2, -z+3/4, -y+5/4', 'x, z+1/2, y+1/2', '-x+3/4, z+1, -y+3/4', '-z+1/4, -y+5/4, x+1', '-z+3/4, y+1, -x+3/4', 'z+1/2, -y+3/4, -x+5/4', 'z, y+1/2, x+1/2', 'x+1/2, y, z+1/2', '-x+5/4, -y+1/4, z+1', '-x+3/4, y+1/2, -z+5/4', 'x+1, -y+3/4, -z+3/4', 'z+1/2, x, y+1/2', 'z+1, -x+3/4, -y+3/4', '-z+5/4, -x+1/4, y+1', '-z+3/4, x+1/2, -y+5/4', 'y+1/2, z, x+1/2', '-y+3/4, z+1/2, -x+5/4', 'y+1, -z+3/4, -x+3/4', '-y+5/4, -z+1/4, x+1', 'y+5/4, x+1/4, -z+1', '-y+1/2, -x, -z+1/2', 'y+3/4, -x+1/2, z+5/4', '-y+1, x+3/4, z+3/4', 'x+5/4, z+1/4, -y+1', '-x+1, z+3/4, y+3/4', '-x+1/2, -z, -y+1/2', 'x+3/4, -z+1/2, y+5/4', 'z+5/4, y+1/4, -x+1', 'z+3/4, -y+1/2, x+5/4', '-z+1, y+3/4, x+3/4', '-z+1/2, -y, -x+1/2', '-x+1/2, -y, -z+1/2', 'x+3/4, y+3/4, -z+1', 'x+5/4, -y+1/2, z+3/4', '-x+1, y+1/4, z+5/4', '-z+1/2, -x, -y+1/2', '-z+1, x+1/4, y+5/4', 'z+3/4, x+3/4, -y+1', 'z+5/4, -x+1/2, y+3/4', '-y+1/2, -z, -x+1/2', 'y+5/4, -z+1/2, x+3/4', '-y+1, z+1/4, x+5/4', 'y+3/4, z+3/4, -x+1', '-y+3/4, -x+3/4, z+1', 'y+1/2, x, z+1/2', '-y+5/4, x+1/2, -z+3/4', 'y+1, -x+1/4, -z+5/4', '-x+3/4, -z+3/4, y+1', 'x+1, -z+1/4, -y+5/4', 'x+1/2, z, y+1/2', '-x+5/4, z+1/2, -y+3/4', '-z+3/4, -y+3/4, x+1', '-z+5/4, y+1/2, -x+3/4', 'z+1, -y+1/4, -x+5/4', 'z+1/2, y, x+1/2', 'x+1/2, y+1/2, z', '-x+5/4, -y+3/4, z+1/2', '-x+3/4, y+1, -z+3/4', 'x+1, -y+5/4, -z+1/4', 'z+1/2, x+1/2, y', 'z+1, -x+5/4, -y+1/4', '-z+5/4, -x+3/4, y+1/2', '-z+3/4, x+1, -y+3/4', 'y+1/2, z+1/2, x', '-y+3/4, z+1, -x+3/4', 'y+1, -z+5/4, -x+1/4', '-y+5/4, -z+3/4, x+1/2', 'y+5/4, x+3/4, -z+1/2', '-y+1/2, -x+1/2, -z', 'y+3/4, -x+1, z+3/4', '-y+1, x+5/4, z+1/4', 'x+5/4, z+3/4, -y+1/2', '-x+1, z+5/4, y+1/4', '-x+1/2, -z+1/2, -y', 'x+3/4, -z+1, y+3/4', 'z+5/4, y+3/4, -x+1/2', 'z+3/4, -y+1, x+3/4', '-z+1, y+5/4, x+1/4', '-z+1/2, -y+1/2, -x', '-x+1/2, -y+1/2, -z', 'x+3/4, y+5/4, -z+1/2', 'x+5/4, -y+1, z+1/4', '-x+1, y+3/4, z+3/4', '-z+1/2, -x+1/2, -y', '-z+1, x+3/4, y+3/4', 'z+3/4, x+5/4, -y+1/2', 'z+5/4, -x+1, y+1/4', '-y+1/2, -z+1/2, -x', 'y+5/4, -z+1, x+1/4', '-y+1, z+3/4, x+3/4', 'y+3/4, z+5/4, -x+1/2', '-y+3/4, -x+5/4, z+1/2', 'y+1/2, x+1/2, z', '-y+5/4, x+1, -z+1/4', 'y+1, -x+3/4, -z+3/4', '-x+3/4, -z+5/4, y+1/2', 'x+1, -z+3/4, -y+3/4', 'x+1/2, z+1/2, y', '-x+5/4, z+1, -y+1/4', '-z+3/4, -y+5/4, x+1/2', '-z+5/4, y+1, -x+1/4', 'z+1, -y+3/4, -x+3/4', 'z+1/2, y+1/2, x'], ['0, y, -y', '3/4, -y+1/4, -y+1/2', '1/4, y+1/2, y+3/4', '1/2, -y+3/4, y+1/4', '-y, 0, y', '-y+1/2, 3/4, -y+1/4', 'y+3/4, 1/4, y+1/2', 'y+1/4, 1/2, -y+3/4', 'y, -y, 0', '-y+1/4, -y+1/2, 3/4', 'y+1/2, y+3/4, 1/4', '-y+3/4, y+1/4, 1/2', '0, -y, y', '1/4, y+3/4, y+1/2', '3/4, -y+1/2, -y+1/4', '1/2, y+1/4, -y+3/4', 'y, 0, -y', 'y+1/2, 1/4, y+3/4', '-y+1/4, 3/4, -y+1/2', '-y+3/4, 1/2, y+1/4', '-y, y, 0', 'y+3/4, y+1/2, 1/4', '-y+1/2, -y+1/4, 3/4', 'y+1/4, -y+3/4, 1/2', '0, y+1/2, -y+1/2', '3/4, -y+3/4, -y+1', '1/4, y+1, y+5/4', '1/2, -y+5/4, y+3/4', '-y, 1/2, y+1/2', '-y+1/2, 5/4, -y+3/4', 'y+3/4, 3/4, y+1', 'y+1/4, 1, -y+5/4', 'y, -y+1/2, 1/2', '-y+1/4, -y+1, 5/4', 'y+1/2, y+5/4, 3/4', '-y+3/4, y+3/4, 1', '0, -y+1/2, y+1/2', '1/4, y+5/4, y+1', '3/4, -y+1, -y+3/4', '1/2, y+3/4, -y+5/4', 'y, 1/2, -y+1/2', 'y+1/2, 3/4, y+5/4', '-y+1/4, 5/4, -y+1', '-y+3/4, 1, y+3/4', '-y, y+1/2, 1/2', 'y+3/4, y+1, 3/4', '-y+1/2, -y+3/4, 5/4', 'y+1/4, -y+5/4, 1', '1/2, y, -y+1/2', '5/4, -y+1/4, -y+1', '3/4, y+1/2, y+5/4', '1, -y+3/4, y+3/4', '-y+1/2, 0, y+1/2', '-y+1, 3/4, -y+3/4', 'y+5/4, 1/4, y+1', 'y+3/4, 1/2, -y+5/4', 'y+1/2, -y, 1/2', '-y+3/4, -y+1/2, 5/4', 'y+1, y+3/4, 3/4', '-y+5/4, y+1/4, 1', '1/2, -y, y+1/2', '3/4, y+3/4, y+1', '5/4, -y+1/2, -y+3/4', '1, y+1/4, -y+5/4', 'y+1/2, 0, -y+1/2', 'y+1, 1/4, y+5/4', '-y+3/4, 3/4, -y+1', '-y+5/4, 1/2, y+3/4', '-y+1/2, y, 1/2', 'y+5/4, y+1/2, 3/4', '-y+1, -y+1/4, 5/4', 'y+3/4, -y+3/4, 1', '1/2, y+1/2, -y', '5/4, -y+3/4, -y+1/2', '3/4, y+1, y+3/4', '1, -y+5/4, y+1/4', '-y+1/2, 1/2, y', '-y+1, 5/4, -y+1/4', 'y+5/4, 3/4, y+1/2', 'y+3/4, 1, -y+3/4', 'y+1/2, -y+1/2, 0', '-y+3/4, -y+1, 3/4', 'y+1, y+5/4, 1/4', '-y+5/4, y+3/4, 1/2', '1/2, -y+1/2, y', '3/4, y+5/4, y+1/2', '5/4, -y+1, -y+1/4', '1, y+3/4, -y+3/4', 'y+1/2, 1/2, -y', 'y+1, 3/4, y+3/4', '-y+3/4, 5/4, -y+1/2', '-y+5/4, 1, y+1/4', '-y+1/2, y+1/2, 0', 'y+5/4, y+1, 1/4', '-y+1, -y+3/4, 3/4', 'y+3/4, -y+5/4, 1/2'], ['x, x, z', '-x+3/4, -x+1/4, z+1/2', '-x+1/4, x+1/2, -z+3/4', 'x+1/2, -x+3/4, -z+1/4', 'z, x, x', 'z+1/2, -x+3/4, -x+1/4', '-z+3/4, -x+1/4, x+1/2', '-z+1/4, x+1/2, -x+3/4', 'x, z, x', '-x+1/4, z+1/2, -x+3/4', 'x+1/2, -z+3/4, -x+1/4', '-x+3/4, -z+1/4, x+1/2', 'x+3/4, x+1/4, -z+1/2', '-x, -x, -z', 'x+1/4, -x+1/2, z+3/4', '-x+1/2, x+3/4, z+1/4', 'x+3/4, z+1/4, -x+1/2', '-x+1/2, z+3/4, x+1/4', '-x, -z, -x', 'x+1/4, -z+1/2, x+3/4', 'z+3/4, x+1/4, -x+1/2', 'z+1/4, -x+1/2, x+3/4', '-z+1/2, x+3/4, x+1/4', '-z, -x, -x', 'x, x+1/2, z+1/2', '-x+3/4, -x+3/4, z+1', '-x+1/4, x+1, -z+5/4', 'x+1/2, -x+5/4, -z+3/4', 'z, x+1/2, x+1/2', 'z+1/2, -x+5/4, -x+3/4', '-z+3/4, -x+3/4, x+1', '-z+1/4, x+1, -x+5/4', 'x, z+1/2, x+1/2', '-x+1/4, z+1, -x+5/4', 'x+1/2, -z+5/4, -x+3/4', '-x+3/4, -z+3/4, x+1', 'x+3/4, x+3/4, -z+1', '-x, -x+1/2, -z+1/2', 'x+1/4, -x+1, z+5/4', '-x+1/2, x+5/4, z+3/4', 'x+3/4, z+3/4, -x+1', '-x+1/2, z+5/4, x+3/4', '-x, -z+1/2, -x+1/2', 'x+1/4, -z+1, x+5/4', 'z+3/4, x+3/4, -x+1', 'z+1/4, -x+1, x+5/4', '-z+1/2, x+5/4, x+3/4', '-z, -x+1/2, -x+1/2', 'x+1/2, x, z+1/2', '-x+5/4, -x+1/4, z+1', '-x+3/4, x+1/2, -z+5/4', 'x+1, -x+3/4, -z+3/4', 'z+1/2, x, x+1/2', 'z+1, -x+3/4, -x+3/4', '-z+5/4, -x+1/4, x+1', '-z+3/4, x+1/2, -x+5/4', 'x+1/2, z, x+1/2', '-x+3/4, z+1/2, -x+5/4', 'x+1, -z+3/4, -x+3/4', '-x+5/4, -z+1/4, x+1', 'x+5/4, x+1/4, -z+1', '-x+1/2, -x, -z+1/2', 'x+3/4, -x+1/2, z+5/4', '-x+1, x+3/4, z+3/4', 'x+5/4, z+1/4, -x+1', '-x+1, z+3/4, x+3/4', '-x+1/2, -z, -x+1/2', 'x+3/4, -z+1/2, x+5/4', 'z+5/4, x+1/4, -x+1', 'z+3/4, -x+1/2, x+5/4', '-z+1, x+3/4, x+3/4', '-z+1/2, -x, -x+1/2', 'x+1/2, x+1/2, z', '-x+5/4, -x+3/4, z+1/2', '-x+3/4, x+1, -z+3/4', 'x+1, -x+5/4, -z+1/4', 'z+1/2, x+1/2, x', 'z+1, -x+5/4, -x+1/4', '-z+5/4, -x+3/4, x+1/2', '-z+3/4, x+1, -x+3/4', 'x+1/2, z+1/2, x', '-x+3/4, z+1, -x+3/4', 'x+1, -z+5/4, -x+1/4', '-x+5/4, -z+3/4, x+1/2', 'x+5/4, x+3/4, -z+1/2', '-x+1/2, -x+1/2, -z', 'x+3/4, -x+1, z+3/4', '-x+1, x+5/4, z+1/4', 'x+5/4, z+3/4, -x+1/2', '-x+1, z+5/4, x+1/4', '-x+1/2, -z+1/2, -x', 'x+3/4, -z+1, x+3/4', 'z+5/4, x+3/4, -x+1/2', 'z+3/4, -x+1, x+3/4', '-z+1, x+5/4, x+1/4', '-z+1/2, -x+1/2, -x'], ['x, 1/8, 1/8', '-x+3/4, 1/8, 5/8', '1/8, x, 1/8', '5/8, -x+3/4, 1/8', '1/8, 1/8, x', '1/8, 5/8, -x+3/4', '7/8, x+1/4, 3/8', '7/8, -x, 7/8', 'x+3/4, 3/8, 3/8', '-x+1/2, 7/8, 3/8', '7/8, 3/8, -x+1/2', '3/8, 3/8, x+3/4', 'x, 5/8, 5/8', '-x+3/4, 5/8, 9/8', '1/8, x+1/2, 5/8', '5/8, -x+5/4, 5/8', '1/8, 5/8, x+1/2', '1/8, 9/8, -x+5/4', '7/8, x+3/4, 7/8', '7/8, -x+1/2, 11/8', 'x+3/4, 7/8, 7/8', '-x+1/2, 11/8, 7/8', '7/8, 7/8, -x+1', '3/8, 7/8, x+5/4', 'x+1/2, 1/8, 5/8', '-x+5/4, 1/8, 9/8', '5/8, x, 5/8', '9/8, -x+3/4, 5/8', '5/8, 1/8, x+1/2', '5/8, 5/8, -x+5/4', '11/8, x+1/4, 7/8', '11/8, -x, 11/8', 'x+5/4, 3/8, 7/8', '-x+1, 7/8, 7/8', '11/8, 3/8, -x+1', '7/8, 3/8, x+5/4', 'x+1/2, 5/8, 1/8', '-x+5/4, 5/8, 5/8', '5/8, x+1/2, 1/8', '9/8, -x+5/4, 1/8', '5/8, 5/8, x', '5/8, 9/8, -x+3/4', '11/8, x+3/4, 3/8', '11/8, -x+1/2, 7/8', 'x+5/4, 7/8, 3/8', '-x+1, 11/8, 3/8', '11/8, 7/8, -x+1/2', '7/8, 7/8, x+3/4'], ['x, x, x', '-x+3/4, -x+1/4, x+1/2', '-x+1/4, x+1/2, -x+3/4', 'x+1/2, -x+3/4, -x+1/4', 'x+3/4, x+1/4, -x+1/2', '-x, -x, -x', 'x+1/4, -x+1/2, x+3/4', '-x+1/2, x+3/4, x+1/4', 'x, x+1/2, x+1/2', '-x+3/4, -x+3/4, x+1', '-x+1/4, x+1, -x+5/4', 'x+1/2, -x+5/4, -x+3/4', 'x+3/4, x+3/4, -x+1', '-x, -x+1/2, -x+1/2', 'x+1/4, -x+1, x+5/4', '-x+1/2, x+5/4, x+3/4', 'x+1/2, x, x+1/2', '-x+5/4, -x+1/4, x+1', '-x+3/4, x+1/2, -x+5/4', 'x+1, -x+3/4, -x+3/4', 'x+5/4, x+1/4, -x+1', '-x+1/2, -x, -x+1/2', 'x+3/4, -x+1/2, x+5/4', '-x+1, x+3/4, x+3/4', 'x+1/2, x+1/2, x', '-x+5/4, -x+3/4, x+1/2', '-x+3/4, x+1, -x+3/4', 'x+1, -x+5/4, -x+1/4', 'x+5/4, x+3/4, -x+1/2', '-x+1/2, -x+1/2, -x', 'x+3/4, -x+1, x+3/4', '-x+1, x+5/4, x+1/4'], ['1/2, 1/2, 1/2', '1/4, 3/4, 0', '3/4, 0, 1/4', '0, 1/4, 3/4', '1/2, 1, 1', '1/4, 5/4, 1/2', '3/4, 1/2, 3/4', '0, 3/4, 5/4', '1, 1/2, 1', '3/4, 3/4, 1/2', '5/4, 0, 3/4', '1/2, 1/4, 5/4', '1, 1, 1/2', '3/4, 5/4, 0', '5/4, 1/2, 1/4', '1/2, 3/4, 3/4'], ['0, 0, 0', '3/4, 1/4, 1/2', '1/4, 1/2, 3/4', '1/2, 3/4, 1/4', '0, 1/2, 1/2', '3/4, 3/4, 1', '1/4, 1, 5/4', '1/2, 5/4, 3/4', '1/2, 0, 1/2', '5/4, 1/4, 1', '3/4, 1/2, 5/4', '1, 3/4, 3/4', '1/2, 1/2, 0', '5/4, 3/4, 1/2', '3/4, 1, 3/4', '1, 5/4, 1/4'], ['3/8, 3/8, 3/8', '1/8, 5/8, 1/8', '3/8, 7/8, 7/8', '1/8, 9/8, 5/8', '7/8, 3/8, 7/8', '5/8, 5/8, 5/8', '7/8, 7/8, 3/8', '5/8, 9/8, 1/8'], ['1/8, 1/8, 1/8', '7/8, 3/8, 3/8', '1/8, 5/8, 5/8', '7/8, 7/8, 7/8', '5/8, 1/8, 5/8', '11/8, 3/8, 7/8', '5/8, 5/8, 1/8', '11/8, 7/8, 3/8']]" +228,"[['x, y, z', '-x+1/4, -y+3/4, z+1/2', '-x+3/4, y+1/2, -z+1/4', 'x+1/2, -y+1/4, -z+3/4', 'z, x, y', 'z+1/2, -x+1/4, -y+3/4', '-z+1/4, -x+3/4, y+1/2', '-z+3/4, x+1/2, -y+1/4', 'y, z, x', '-y+3/4, z+1/2, -x+1/4', 'y+1/2, -z+1/4, -x+3/4', '-y+1/4, -z+3/4, x+1/2', 'y+3/4, x+1/4, -z', '-y+1/2, -x+1/2, -z+1/2', 'y+1/4, -x, z+3/4', '-y, x+3/4, z+1/4', 'x+3/4, z+1/4, -y', '-x, z+3/4, y+1/4', '-x+1/2, -z+1/2, -y+1/2', 'x+1/4, -z, y+3/4', 'z+3/4, y+1/4, -x', 'z+1/4, -y, x+3/4', '-z, y+3/4, x+1/4', '-z+1/2, -y+1/2, -x+1/2', '-x, -y, -z', 'x+3/4, y+1/4, -z+1/2', 'x+1/4, -y+1/2, z+3/4', '-x+1/2, y+3/4, z+1/4', '-z, -x, -y', '-z+1/2, x+3/4, y+1/4', 'z+3/4, x+1/4, -y+1/2', 'z+1/4, -x+1/2, y+3/4', '-y, -z, -x', 'y+1/4, -z+1/2, x+3/4', '-y+1/2, z+3/4, x+1/4', 'y+3/4, z+1/4, -x+1/2', '-y+1/4, -x+3/4, z', 'y+1/2, x+1/2, z+1/2', '-y+3/4, x, -z+1/4', 'y, -x+1/4, -z+3/4', '-x+1/4, -z+3/4, y', 'x, -z+1/4, -y+3/4', 'x+1/2, z+1/2, y+1/2', '-x+3/4, z, -y+1/4', '-z+1/4, -y+3/4, x', '-z+3/4, y, -x+1/4', 'z, -y+1/4, -x+3/4', 'z+1/2, y+1/2, x+1/2', 'x, y+1/2, z+1/2', '-x+1/4, -y+5/4, z+1', '-x+3/4, y+1, -z+3/4', 'x+1/2, -y+3/4, -z+5/4', 'z, x+1/2, y+1/2', 'z+1/2, -x+3/4, -y+5/4', '-z+1/4, -x+5/4, y+1', '-z+3/4, x+1, -y+3/4', 'y, z+1/2, x+1/2', '-y+3/4, z+1, -x+3/4', 'y+1/2, -z+3/4, -x+5/4', '-y+1/4, -z+5/4, x+1', 'y+3/4, x+3/4, -z+1/2', '-y+1/2, -x+1, -z+1', 'y+1/4, -x+1/2, z+5/4', '-y, x+5/4, z+3/4', 'x+3/4, z+3/4, -y+1/2', '-x, z+5/4, y+3/4', '-x+1/2, -z+1, -y+1', 'x+1/4, -z+1/2, y+5/4', 'z+3/4, y+3/4, -x+1/2', 'z+1/4, -y+1/2, x+5/4', '-z, y+5/4, x+3/4', '-z+1/2, -y+1, -x+1', '-x, -y+1/2, -z+1/2', 'x+3/4, y+3/4, -z+1', 'x+1/4, -y+1, z+5/4', '-x+1/2, y+5/4, z+3/4', '-z, -x+1/2, -y+1/2', '-z+1/2, x+5/4, y+3/4', 'z+3/4, x+3/4, -y+1', 'z+1/4, -x+1, y+5/4', '-y, -z+1/2, -x+1/2', 'y+1/4, -z+1, x+5/4', '-y+1/2, z+5/4, x+3/4', 'y+3/4, z+3/4, -x+1', '-y+1/4, -x+5/4, z+1/2', 'y+1/2, x+1, z+1', '-y+3/4, x+1/2, -z+3/4', 'y, -x+3/4, -z+5/4', '-x+1/4, -z+5/4, y+1/2', 'x, -z+3/4, -y+5/4', 'x+1/2, z+1, y+1', '-x+3/4, z+1/2, -y+3/4', '-z+1/4, -y+5/4, x+1/2', '-z+3/4, y+1/2, -x+3/4', 'z, -y+3/4, -x+5/4', 'z+1/2, y+1, x+1', 'x+1/2, y, z+1/2', '-x+3/4, -y+3/4, z+1', '-x+5/4, y+1/2, -z+3/4', 'x+1, -y+1/4, -z+5/4', 'z+1/2, x, y+1/2', 'z+1, -x+1/4, -y+5/4', '-z+3/4, -x+3/4, y+1', '-z+5/4, x+1/2, -y+3/4', 'y+1/2, z, x+1/2', '-y+5/4, z+1/2, -x+3/4', 'y+1, -z+1/4, -x+5/4', '-y+3/4, -z+3/4, x+1', 'y+5/4, x+1/4, -z+1/2', '-y+1, -x+1/2, -z+1', 'y+3/4, -x, z+5/4', '-y+1/2, x+3/4, z+3/4', 'x+5/4, z+1/4, -y+1/2', '-x+1/2, z+3/4, y+3/4', '-x+1, -z+1/2, -y+1', 'x+3/4, -z, y+5/4', 'z+5/4, y+1/4, -x+1/2', 'z+3/4, -y, x+5/4', '-z+1/2, y+3/4, x+3/4', '-z+1, -y+1/2, -x+1', '-x+1/2, -y, -z+1/2', 'x+5/4, y+1/4, -z+1', 'x+3/4, -y+1/2, z+5/4', '-x+1, y+3/4, z+3/4', '-z+1/2, -x, -y+1/2', '-z+1, x+3/4, y+3/4', 'z+5/4, x+1/4, -y+1', 'z+3/4, -x+1/2, y+5/4', '-y+1/2, -z, -x+1/2', 'y+3/4, -z+1/2, x+5/4', '-y+1, z+3/4, x+3/4', 'y+5/4, z+1/4, -x+1', '-y+3/4, -x+3/4, z+1/2', 'y+1, x+1/2, z+1', '-y+5/4, x, -z+3/4', 'y+1/2, -x+1/4, -z+5/4', '-x+3/4, -z+3/4, y+1/2', 'x+1/2, -z+1/4, -y+5/4', 'x+1, z+1/2, y+1', '-x+5/4, z, -y+3/4', '-z+3/4, -y+3/4, x+1/2', '-z+5/4, y, -x+3/4', 'z+1/2, -y+1/4, -x+5/4', 'z+1, y+1/2, x+1', 'x+1/2, y+1/2, z', '-x+3/4, -y+5/4, z+1/2', '-x+5/4, y+1, -z+1/4', 'x+1, -y+3/4, -z+3/4', 'z+1/2, x+1/2, y', 'z+1, -x+3/4, -y+3/4', '-z+3/4, -x+5/4, y+1/2', '-z+5/4, x+1, -y+1/4', 'y+1/2, z+1/2, x', '-y+5/4, z+1, -x+1/4', 'y+1, -z+3/4, -x+3/4', '-y+3/4, -z+5/4, x+1/2', 'y+5/4, x+3/4, -z', '-y+1, -x+1, -z+1/2', 'y+3/4, -x+1/2, z+3/4', '-y+1/2, x+5/4, z+1/4', 'x+5/4, z+3/4, -y', '-x+1/2, z+5/4, y+1/4', '-x+1, -z+1, -y+1/2', 'x+3/4, -z+1/2, y+3/4', 'z+5/4, y+3/4, -x', 'z+3/4, -y+1/2, x+3/4', '-z+1/2, y+5/4, x+1/4', '-z+1, -y+1, -x+1/2', '-x+1/2, -y+1/2, -z', 'x+5/4, y+3/4, -z+1/2', 'x+3/4, -y+1, z+3/4', '-x+1, y+5/4, z+1/4', '-z+1/2, -x+1/2, -y', '-z+1, x+5/4, y+1/4', 'z+5/4, x+3/4, -y+1/2', 'z+3/4, -x+1, y+3/4', '-y+1/2, -z+1/2, -x', 'y+3/4, -z+1, x+3/4', '-y+1, z+5/4, x+1/4', 'y+5/4, z+3/4, -x+1/2', '-y+3/4, -x+5/4, z', 'y+1, x+1, z+1/2', '-y+5/4, x+1/2, -z+1/4', 'y+1/2, -x+3/4, -z+3/4', '-x+3/4, -z+5/4, y', 'x+1/2, -z+3/4, -y+3/4', 'x+1, z+1, y+1/2', '-x+5/4, z+1/2, -y+1/4', '-z+3/4, -y+5/4, x', '-z+5/4, y+1/2, -x+1/4', 'z+1/2, -y+3/4, -x+3/4', 'z+1, y+1, x+1/2'], ['1/4, y, -y', '0, -y+3/4, -y+1/2', '1/2, y+1/2, y+1/4', '3/4, -y+1/4, y+3/4', '-y, 1/4, y', '-y+1/2, 0, -y+3/4', 'y+1/4, 1/2, y+1/2', 'y+3/4, 3/4, -y+1/4', 'y, -y, 1/4', '-y+3/4, -y+1/2, 0', 'y+1/2, y+1/4, 1/2', '-y+1/4, y+3/4, 3/4', '3/4, -y, y', '0, y+1/4, y+1/2', '1/2, -y+1/2, -y+3/4', '1/4, y+3/4, -y+1/4', 'y, 3/4, -y', 'y+1/2, 0, y+1/4', '-y+3/4, 1/2, -y+1/2', '-y+1/4, 1/4, y+3/4', '-y, y, 3/4', 'y+1/4, y+1/2, 0', '-y+1/2, -y+3/4, 1/2', 'y+3/4, -y+1/4, 1/4', '1/4, y+1/2, -y+1/2', '0, -y+5/4, -y+1', '1/2, y+1, y+3/4', '3/4, -y+3/4, y+5/4', '-y, 3/4, y+1/2', '-y+1/2, 1/2, -y+5/4', 'y+1/4, 1, y+1', 'y+3/4, 5/4, -y+3/4', 'y, -y+1/2, 3/4', '-y+3/4, -y+1, 1/2', 'y+1/2, y+3/4, 1', '-y+1/4, y+5/4, 5/4', '3/4, -y+1/2, y+1/2', '0, y+3/4, y+1', '1/2, -y+1, -y+5/4', '1/4, y+5/4, -y+3/4', 'y, 5/4, -y+1/2', 'y+1/2, 1/2, y+3/4', '-y+3/4, 1, -y+1', '-y+1/4, 3/4, y+5/4', '-y, y+1/2, 5/4', 'y+1/4, y+1, 1/2', '-y+1/2, -y+5/4, 1', 'y+3/4, -y+3/4, 3/4', '3/4, y, -y+1/2', '1/2, -y+3/4, -y+1', '1, y+1/2, y+3/4', '5/4, -y+1/4, y+5/4', '-y+1/2, 1/4, y+1/2', '-y+1, 0, -y+5/4', 'y+3/4, 1/2, y+1', 'y+5/4, 3/4, -y+3/4', 'y+1/2, -y, 3/4', '-y+5/4, -y+1/2, 1/2', 'y+1, y+1/4, 1', '-y+3/4, y+3/4, 5/4', '5/4, -y, y+1/2', '1/2, y+1/4, y+1', '1, -y+1/2, -y+5/4', '3/4, y+3/4, -y+3/4', 'y+1/2, 3/4, -y+1/2', 'y+1, 0, y+3/4', '-y+5/4, 1/2, -y+1', '-y+3/4, 1/4, y+5/4', '-y+1/2, y, 5/4', 'y+3/4, y+1/2, 1/2', '-y+1, -y+3/4, 1', 'y+5/4, -y+1/4, 3/4', '3/4, y+1/2, -y', '1/2, -y+5/4, -y+1/2', '1, y+1, y+1/4', '5/4, -y+3/4, y+3/4', '-y+1/2, 3/4, y', '-y+1, 1/2, -y+3/4', 'y+3/4, 1, y+1/2', 'y+5/4, 5/4, -y+1/4', 'y+1/2, -y+1/2, 1/4', '-y+5/4, -y+1, 0', 'y+1, y+3/4, 1/2', '-y+3/4, y+5/4, 3/4', '5/4, -y+1/2, y', '1/2, y+3/4, y+1/2', '1, -y+1, -y+3/4', '3/4, y+5/4, -y+1/4', 'y+1/2, 5/4, -y', 'y+1, 1/2, y+1/4', '-y+5/4, 1, -y+1/2', '-y+3/4, 3/4, y+3/4', '-y+1/2, y+1/2, 3/4', 'y+3/4, y+1, 0', '-y+1, -y+5/4, 1/2', 'y+5/4, -y+3/4, 1/4'], ['x, 1/8, 1/8', '-x+1/4, 5/8, 5/8', '1/8, x, 1/8', '5/8, -x+1/4, 5/8', '1/8, 1/8, x', '5/8, 5/8, -x+1/4', '7/8, x+1/4, 7/8', '3/8, -x+1/2, 3/8', 'x+3/4, 3/8, 7/8', '-x, 7/8, 3/8', '7/8, 3/8, -x', '3/8, 7/8, x+3/4', '-x, 7/8, 7/8', 'x+3/4, 3/8, 3/8', '7/8, -x, 7/8', '3/8, x+3/4, 3/8', '7/8, 7/8, -x', '3/8, 3/8, x+3/4', '1/8, -x+3/4, 1/8', '5/8, x+1/2, 5/8', '-x+1/4, 5/8, 1/8', 'x, 1/8, 5/8', '1/8, 5/8, x', '5/8, 1/8, -x+1/4', 'x, 5/8, 5/8', '-x+1/4, 9/8, 9/8', '1/8, x+1/2, 5/8', '5/8, -x+3/4, 9/8', '1/8, 5/8, x+1/2', '5/8, 9/8, -x+3/4', '7/8, x+3/4, 11/8', '3/8, -x+1, 7/8', 'x+3/4, 7/8, 11/8', '-x, 11/8, 7/8', '7/8, 7/8, -x+1/2', '3/8, 11/8, x+5/4', '-x, 11/8, 11/8', 'x+3/4, 7/8, 7/8', '7/8, -x+1/2, 11/8', '3/8, x+5/4, 7/8', '7/8, 11/8, -x+1/2', '3/8, 7/8, x+5/4', '1/8, -x+5/4, 5/8', '5/8, x+1, 9/8', '-x+1/4, 9/8, 5/8', 'x, 5/8, 9/8', '1/8, 9/8, x+1/2', '5/8, 5/8, -x+3/4', 'x+1/2, 1/8, 5/8', '-x+3/4, 5/8, 9/8', '5/8, x, 5/8', '9/8, -x+1/4, 9/8', '5/8, 1/8, x+1/2', '9/8, 5/8, -x+3/4', '11/8, x+1/4, 11/8', '7/8, -x+1/2, 7/8', 'x+5/4, 3/8, 11/8', '-x+1/2, 7/8, 7/8', '11/8, 3/8, -x+1/2', '7/8, 7/8, x+5/4', '-x+1/2, 7/8, 11/8', 'x+5/4, 3/8, 7/8', '11/8, -x, 11/8', '7/8, x+3/4, 7/8', '11/8, 7/8, -x+1/2', '7/8, 3/8, x+5/4', '5/8, -x+3/4, 5/8', '9/8, x+1/2, 9/8', '-x+3/4, 5/8, 5/8', 'x+1/2, 1/8, 9/8', '5/8, 5/8, x+1/2', '9/8, 1/8, -x+3/4', 'x+1/2, 5/8, 1/8', '-x+3/4, 9/8, 5/8', '5/8, x+1/2, 1/8', '9/8, -x+3/4, 5/8', '5/8, 5/8, x', '9/8, 9/8, -x+1/4', '11/8, x+3/4, 7/8', '7/8, -x+1, 3/8', 'x+5/4, 7/8, 7/8', '-x+1/2, 11/8, 3/8', '11/8, 7/8, -x', '7/8, 11/8, x+3/4', '-x+1/2, 11/8, 7/8', 'x+5/4, 7/8, 3/8', '11/8, -x+1/2, 7/8', '7/8, x+5/4, 3/8', '11/8, 11/8, -x', '7/8, 7/8, x+3/4', '5/8, -x+5/4, 1/8', '9/8, x+1, 5/8', '-x+3/4, 9/8, 1/8', 'x+1/2, 5/8, 5/8', '5/8, 9/8, x', '9/8, 5/8, -x+1/4'], ['x, x, x', '-x+1/4, -x+3/4, x+1/2', '-x+3/4, x+1/2, -x+1/4', 'x+1/2, -x+1/4, -x+3/4', 'x+3/4, x+1/4, -x', '-x+1/2, -x+1/2, -x+1/2', 'x+1/4, -x, x+3/4', '-x, x+3/4, x+1/4', '-x, -x, -x', 'x+3/4, x+1/4, -x+1/2', 'x+1/4, -x+1/2, x+3/4', '-x+1/2, x+3/4, x+1/4', '-x+1/4, -x+3/4, x', 'x+1/2, x+1/2, x+1/2', '-x+3/4, x, -x+1/4', 'x, -x+1/4, -x+3/4', 'x, x+1/2, x+1/2', '-x+1/4, -x+5/4, x+1', '-x+3/4, x+1, -x+3/4', 'x+1/2, -x+3/4, -x+5/4', 'x+3/4, x+3/4, -x+1/2', '-x+1/2, -x+1, -x+1', 'x+1/4, -x+1/2, x+5/4', '-x, x+5/4, x+3/4', '-x, -x+1/2, -x+1/2', 'x+3/4, x+3/4, -x+1', 'x+1/4, -x+1, x+5/4', '-x+1/2, x+5/4, x+3/4', '-x+1/4, -x+5/4, x+1/2', 'x+1/2, x+1, x+1', '-x+3/4, x+1/2, -x+3/4', 'x, -x+3/4, -x+5/4', 'x+1/2, x, x+1/2', '-x+3/4, -x+3/4, x+1', '-x+5/4, x+1/2, -x+3/4', 'x+1, -x+1/4, -x+5/4', 'x+5/4, x+1/4, -x+1/2', '-x+1, -x+1/2, -x+1', 'x+3/4, -x, x+5/4', '-x+1/2, x+3/4, x+3/4', '-x+1/2, -x, -x+1/2', 'x+5/4, x+1/4, -x+1', 'x+3/4, -x+1/2, x+5/4', '-x+1, x+3/4, x+3/4', '-x+3/4, -x+3/4, x+1/2', 'x+1, x+1/2, x+1', '-x+5/4, x, -x+3/4', 'x+1/2, -x+1/4, -x+5/4', 'x+1/2, x+1/2, x', '-x+3/4, -x+5/4, x+1/2', '-x+5/4, x+1, -x+1/4', 'x+1, -x+3/4, -x+3/4', 'x+5/4, x+3/4, -x', '-x+1, -x+1, -x+1/2', 'x+3/4, -x+1/2, x+3/4', '-x+1/2, x+5/4, x+1/4', '-x+1/2, -x+1/2, -x', 'x+5/4, x+3/4, -x+1/2', 'x+3/4, -x+1, x+3/4', '-x+1, x+5/4, x+1/4', '-x+3/4, -x+5/4, x', 'x+1, x+1, x+1/2', '-x+5/4, x+1/2, -x+1/4', 'x+1/2, -x+3/4, -x+3/4'], ['7/8, 1/8, 1/8', '3/8, 5/8, 5/8', '1/8, 7/8, 1/8', '5/8, 3/8, 5/8', '1/8, 1/8, 7/8', '5/8, 5/8, 3/8', '7/8, 1/8, 7/8', '3/8, 5/8, 3/8', '5/8, 3/8, 7/8', '1/8, 7/8, 3/8', '7/8, 3/8, 1/8', '3/8, 7/8, 5/8', '7/8, 5/8, 5/8', '3/8, 9/8, 9/8', '1/8, 11/8, 5/8', '5/8, 7/8, 9/8', '1/8, 5/8, 11/8', '5/8, 9/8, 7/8', '7/8, 5/8, 11/8', '3/8, 9/8, 7/8', '5/8, 7/8, 11/8', '1/8, 11/8, 7/8', '7/8, 7/8, 5/8', '3/8, 11/8, 9/8', '11/8, 1/8, 5/8', '7/8, 5/8, 9/8', '5/8, 7/8, 5/8', '9/8, 3/8, 9/8', '5/8, 1/8, 11/8', '9/8, 5/8, 7/8', '11/8, 1/8, 11/8', '7/8, 5/8, 7/8', '9/8, 3/8, 11/8', '5/8, 7/8, 7/8', '11/8, 3/8, 5/8', '7/8, 7/8, 9/8', '11/8, 5/8, 1/8', '7/8, 9/8, 5/8', '5/8, 11/8, 1/8', '9/8, 7/8, 5/8', '5/8, 5/8, 7/8', '9/8, 9/8, 3/8', '11/8, 5/8, 7/8', '7/8, 9/8, 3/8', '9/8, 7/8, 7/8', '5/8, 11/8, 3/8', '11/8, 7/8, 1/8', '7/8, 11/8, 5/8'], ['0, 0, 0', '1/4, 3/4, 1/2', '3/4, 1/2, 1/4', '1/2, 1/4, 3/4', '3/4, 1/4, 0', '1/2, 1/2, 1/2', '1/4, 0, 3/4', '0, 3/4, 1/4', '0, 1/2, 1/2', '1/4, 5/4, 1', '3/4, 1, 3/4', '1/2, 3/4, 5/4', '3/4, 3/4, 1/2', '1/2, 1, 1', '1/4, 1/2, 5/4', '0, 5/4, 3/4', '1/2, 0, 1/2', '3/4, 3/4, 1', '5/4, 1/2, 3/4', '1, 1/4, 5/4', '5/4, 1/4, 1/2', '1, 1/2, 1', '3/4, 0, 5/4', '1/2, 3/4, 3/4', '1/2, 1/2, 0', '3/4, 5/4, 1/2', '5/4, 1, 1/4', '1, 3/4, 3/4', '5/4, 3/4, 0', '1, 1, 1/2', '3/4, 1/2, 3/4', '1/2, 5/4, 1/4'], ['1/4, 1/4, 1/4', '0, 1/2, 3/4', '1/2, 3/4, 0', '3/4, 0, 1/2', '3/4, 3/4, 3/4', '0, 1/2, 1/4', '1/2, 1/4, 0', '1/4, 0, 1/2', '1/4, 3/4, 3/4', '0, 1, 5/4', '1/2, 5/4, 1/2', '3/4, 1/2, 1', '3/4, 5/4, 5/4', '0, 1, 3/4', '1/2, 3/4, 1/2', '1/4, 1/2, 1', '3/4, 1/4, 3/4', '1/2, 1/2, 5/4', '1, 3/4, 1/2', '5/4, 0, 1', '5/4, 3/4, 5/4', '1/2, 1/2, 3/4', '1, 1/4, 1/2', '3/4, 0, 1', '3/4, 3/4, 1/4', '1/2, 1, 3/4', '1, 5/4, 0', '5/4, 1/2, 1/2', '5/4, 5/4, 3/4', '1/2, 1, 1/4', '1, 3/4, 0', '3/4, 1/2, 1/2'], ['1/8, 1/8, 1/8', '7/8, 3/8, 7/8', '7/8, 7/8, 7/8', '1/8, 5/8, 1/8', '1/8, 5/8, 5/8', '7/8, 7/8, 11/8', '7/8, 11/8, 11/8', '1/8, 9/8, 5/8', '5/8, 1/8, 5/8', '11/8, 3/8, 11/8', '11/8, 7/8, 11/8', '5/8, 5/8, 5/8', '5/8, 5/8, 1/8', '11/8, 7/8, 7/8', '11/8, 11/8, 7/8', '5/8, 9/8, 1/8']]" +229,"[['x, y, z', '-x, -y, z', '-x, y, -z', 'x, -y, -z', 'z, x, y', 'z, -x, -y', '-z, -x, y', '-z, x, -y', 'y, z, x', '-y, z, -x', 'y, -z, -x', '-y, -z, x', 'y, x, -z', '-y, -x, -z', 'y, -x, z', '-y, x, z', 'x, z, -y', '-x, z, y', '-x, -z, -y', 'x, -z, y', 'z, y, -x', 'z, -y, x', '-z, y, x', '-z, -y, -x', '-x, -y, -z', 'x, y, -z', 'x, -y, z', '-x, y, z', '-z, -x, -y', '-z, x, y', 'z, x, -y', 'z, -x, y', '-y, -z, -x', 'y, -z, x', '-y, z, x', 'y, z, -x', '-y, -x, z', 'y, x, z', '-y, x, -z', 'y, -x, -z', '-x, -z, y', 'x, -z, -y', 'x, z, y', '-x, z, -y', '-z, -y, x', '-z, y, -x', 'z, -y, -x', 'z, y, x', 'x+1/2, y+1/2, z+1/2', '-x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1/2, -x+1/2, -y+1/2', '-z+1/2, -x+1/2, y+1/2', '-z+1/2, x+1/2, -y+1/2', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x+1/2', '-y+1/2, -z+1/2, x+1/2', 'y+1/2, x+1/2, -z+1/2', '-y+1/2, -x+1/2, -z+1/2', 'y+1/2, -x+1/2, z+1/2', '-y+1/2, x+1/2, z+1/2', 'x+1/2, z+1/2, -y+1/2', '-x+1/2, z+1/2, y+1/2', '-x+1/2, -z+1/2, -y+1/2', 'x+1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, x+1/2', '-z+1/2, -y+1/2, -x+1/2', '-x+1/2, -y+1/2, -z+1/2', 'x+1/2, y+1/2, -z+1/2', 'x+1/2, -y+1/2, z+1/2', '-x+1/2, y+1/2, z+1/2', '-z+1/2, -x+1/2, -y+1/2', '-z+1/2, x+1/2, y+1/2', 'z+1/2, x+1/2, -y+1/2', 'z+1/2, -x+1/2, y+1/2', '-y+1/2, -z+1/2, -x+1/2', 'y+1/2, -z+1/2, x+1/2', '-y+1/2, z+1/2, x+1/2', 'y+1/2, z+1/2, -x+1/2', '-y+1/2, -x+1/2, z+1/2', 'y+1/2, x+1/2, z+1/2', '-y+1/2, x+1/2, -z+1/2', 'y+1/2, -x+1/2, -z+1/2', '-x+1/2, -z+1/2, y+1/2', 'x+1/2, -z+1/2, -y+1/2', 'x+1/2, z+1/2, y+1/2', '-x+1/2, z+1/2, -y+1/2', '-z+1/2, -y+1/2, x+1/2', '-z+1/2, y+1/2, -x+1/2', 'z+1/2, -y+1/2, -x+1/2', 'z+1/2, y+1/2, x+1/2'], ['x, x, z', '-x, -x, z', '-x, x, -z', 'x, -x, -z', 'z, x, x', 'z, -x, -x', '-z, -x, x', '-z, x, -x', 'x, z, x', '-x, z, -x', 'x, -z, -x', '-x, -z, x', 'x, x, -z', '-x, -x, -z', 'x, -x, z', '-x, x, z', 'x, z, -x', '-x, z, x', '-x, -z, -x', 'x, -z, x', 'z, x, -x', 'z, -x, x', '-z, x, x', '-z, -x, -x', 'x+1/2, x+1/2, z+1/2', '-x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, -z+1/2', 'x+1/2, -x+1/2, -z+1/2', 'z+1/2, x+1/2, x+1/2', 'z+1/2, -x+1/2, -x+1/2', '-z+1/2, -x+1/2, x+1/2', '-z+1/2, x+1/2, -x+1/2', 'x+1/2, z+1/2, x+1/2', '-x+1/2, z+1/2, -x+1/2', 'x+1/2, -z+1/2, -x+1/2', '-x+1/2, -z+1/2, x+1/2', 'x+1/2, x+1/2, -z+1/2', '-x+1/2, -x+1/2, -z+1/2', 'x+1/2, -x+1/2, z+1/2', '-x+1/2, x+1/2, z+1/2', 'x+1/2, z+1/2, -x+1/2', '-x+1/2, z+1/2, x+1/2', '-x+1/2, -z+1/2, -x+1/2', 'x+1/2, -z+1/2, x+1/2', 'z+1/2, x+1/2, -x+1/2', 'z+1/2, -x+1/2, x+1/2', '-z+1/2, x+1/2, x+1/2', '-z+1/2, -x+1/2, -x+1/2'], ['0, y, z', '0, -y, z', '0, y, -z', '0, -y, -z', 'z, 0, y', 'z, 0, -y', '-z, 0, y', '-z, 0, -y', 'y, z, 0', '-y, z, 0', 'y, -z, 0', '-y, -z, 0', 'y, 0, -z', '-y, 0, -z', 'y, 0, z', '-y, 0, z', '0, z, -y', '0, z, y', '0, -z, -y', '0, -z, y', 'z, y, 0', 'z, -y, 0', '-z, y, 0', '-z, -y, 0', '1/2, y+1/2, z+1/2', '1/2, -y+1/2, z+1/2', '1/2, y+1/2, -z+1/2', '1/2, -y+1/2, -z+1/2', 'z+1/2, 1/2, y+1/2', 'z+1/2, 1/2, -y+1/2', '-z+1/2, 1/2, y+1/2', '-z+1/2, 1/2, -y+1/2', 'y+1/2, z+1/2, 1/2', '-y+1/2, z+1/2, 1/2', 'y+1/2, -z+1/2, 1/2', '-y+1/2, -z+1/2, 1/2', 'y+1/2, 1/2, -z+1/2', '-y+1/2, 1/2, -z+1/2', 'y+1/2, 1/2, z+1/2', '-y+1/2, 1/2, z+1/2', '1/2, z+1/2, -y+1/2', '1/2, z+1/2, y+1/2', '1/2, -z+1/2, -y+1/2', '1/2, -z+1/2, y+1/2', 'z+1/2, y+1/2, 1/2', 'z+1/2, -y+1/2, 1/2', '-z+1/2, y+1/2, 1/2', '-z+1/2, -y+1/2, 1/2'], ['1/4, y, -y+1/2', '3/4, -y, -y+1/2', '3/4, y, y+1/2', '1/4, -y, y+1/2', '-y+1/2, 1/4, y', '-y+1/2, 3/4, -y', 'y+1/2, 3/4, y', 'y+1/2, 1/4, -y', 'y, -y+1/2, 1/4', '-y, -y+1/2, 3/4', 'y, y+1/2, 3/4', '-y, y+1/2, 1/4', '3/4, -y, y+1/2', '1/4, y, y+1/2', '1/4, -y, -y+1/2', '3/4, y, -y+1/2', 'y+1/2, 3/4, -y', 'y+1/2, 1/4, y', '-y+1/2, 1/4, -y', '-y+1/2, 3/4, y', '-y, y+1/2, 3/4', 'y, y+1/2, 1/4', '-y, -y+1/2, 1/4', 'y, -y+1/2, 3/4', '3/4, y+1/2, -y+1', '5/4, -y+1/2, -y+1', '5/4, y+1/2, y+1', '3/4, -y+1/2, y+1', '-y+1, 3/4, y+1/2', '-y+1, 5/4, -y+1/2', 'y+1, 5/4, y+1/2', 'y+1, 3/4, -y+1/2', 'y+1/2, -y+1, 3/4', '-y+1/2, -y+1, 5/4', 'y+1/2, y+1, 5/4', '-y+1/2, y+1, 3/4', '5/4, -y+1/2, y+1', '3/4, y+1/2, y+1', '3/4, -y+1/2, -y+1', '5/4, y+1/2, -y+1', 'y+1, 5/4, -y+1/2', 'y+1, 3/4, y+1/2', '-y+1, 3/4, -y+1/2', '-y+1, 5/4, y+1/2', '-y+1/2, y+1, 5/4', 'y+1/2, y+1, 3/4', '-y+1/2, -y+1, 3/4', 'y+1/2, -y+1, 5/4'], ['0, y, y', '0, -y, y', '0, y, -y', '0, -y, -y', 'y, 0, y', 'y, 0, -y', '-y, 0, y', '-y, 0, -y', 'y, y, 0', '-y, y, 0', 'y, -y, 0', '-y, -y, 0', '1/2, y+1/2, y+1/2', '1/2, -y+1/2, y+1/2', '1/2, y+1/2, -y+1/2', '1/2, -y+1/2, -y+1/2', 'y+1/2, 1/2, y+1/2', 'y+1/2, 1/2, -y+1/2', '-y+1/2, 1/2, y+1/2', '-y+1/2, 1/2, -y+1/2', 'y+1/2, y+1/2, 1/2', '-y+1/2, y+1/2, 1/2', 'y+1/2, -y+1/2, 1/2', '-y+1/2, -y+1/2, 1/2'], ['x, 0, 1/2', '-x, 0, 1/2', '1/2, x, 0', '1/2, -x, 0', '0, 1/2, x', '0, 1/2, -x', '0, x, 1/2', '0, -x, 1/2', 'x, 1/2, 0', '-x, 1/2, 0', '1/2, 0, -x', '1/2, 0, x', 'x+1/2, 1/2, 1', '-x+1/2, 1/2, 1', '1, x+1/2, 1/2', '1, -x+1/2, 1/2', '1/2, 1, x+1/2', '1/2, 1, -x+1/2', '1/2, x+1/2, 1', '1/2, -x+1/2, 1', 'x+1/2, 1, 1/2', '-x+1/2, 1, 1/2', '1, 1/2, -x+1/2', '1, 1/2, x+1/2'], ['x, x, x', '-x, -x, x', '-x, x, -x', 'x, -x, -x', 'x, x, -x', '-x, -x, -x', 'x, -x, x', '-x, x, x', 'x+1/2, x+1/2, x+1/2', '-x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x+1/2', 'x+1/2, x+1/2, -x+1/2', '-x+1/2, -x+1/2, -x+1/2', 'x+1/2, -x+1/2, x+1/2', '-x+1/2, x+1/2, x+1/2'], ['x, 0, 0', '-x, 0, 0', '0, x, 0', '0, -x, 0', '0, 0, x', '0, 0, -x', 'x+1/2, 1/2, 1/2', '-x+1/2, 1/2, 1/2', '1/2, x+1/2, 1/2', '1/2, -x+1/2, 1/2', '1/2, 1/2, x+1/2', '1/2, 1/2, -x+1/2'], ['1/4, 0, 1/2', '3/4, 0, 1/2', '1/2, 1/4, 0', '1/2, 3/4, 0', '0, 1/2, 1/4', '0, 1/2, 3/4', '3/4, 1/2, 1', '5/4, 1/2, 1', '1, 3/4, 1/2', '1, 5/4, 1/2', '1/2, 1, 3/4', '1/2, 1, 5/4'], ['1/4, 1/4, 1/4', '3/4, 3/4, 1/4', '3/4, 1/4, 3/4', '1/4, 3/4, 3/4', '3/4, 3/4, 3/4', '5/4, 5/4, 3/4', '5/4, 3/4, 5/4', '3/4, 5/4, 5/4'], ['0, 1/2, 1/2', '1/2, 0, 1/2', '1/2, 1/2, 0', '1/2, 1, 1', '1, 1/2, 1', '1, 1, 1/2'], ['0, 0, 0', '1/2, 1/2, 1/2']]" +230,"[['x, y, z', '-x+1/2, -y, z+1/2', '-x, y+1/2, -z+1/2', 'x+1/2, -y+1/2, -z', 'z, x, y', 'z+1/2, -x+1/2, -y', '-z+1/2, -x, y+1/2', '-z, x+1/2, -y+1/2', 'y, z, x', '-y, z+1/2, -x+1/2', 'y+1/2, -z+1/2, -x', '-y+1/2, -z, x+1/2', 'y+3/4, x+1/4, -z+1/4', '-y+3/4, -x+3/4, -z+3/4', 'y+1/4, -x+1/4, z+3/4', '-y+1/4, x+3/4, z+1/4', 'x+3/4, z+1/4, -y+1/4', '-x+1/4, z+3/4, y+1/4', '-x+3/4, -z+3/4, -y+3/4', 'x+1/4, -z+1/4, y+3/4', 'z+3/4, y+1/4, -x+1/4', 'z+1/4, -y+1/4, x+3/4', '-z+1/4, y+3/4, x+1/4', '-z+3/4, -y+3/4, -x+3/4', '-x, -y, -z', 'x+1/2, y, -z+1/2', 'x, -y+1/2, z+1/2', '-x+1/2, y+1/2, z', '-z, -x, -y', '-z+1/2, x+1/2, y', 'z+1/2, x, -y+1/2', 'z, -x+1/2, y+1/2', '-y, -z, -x', 'y, -z+1/2, x+1/2', '-y+1/2, z+1/2, x', 'y+1/2, z, -x+1/2', '-y+1/4, -x+3/4, z+3/4', 'y+1/4, x+1/4, z+1/4', '-y+3/4, x+3/4, -z+1/4', 'y+3/4, -x+1/4, -z+3/4', '-x+1/4, -z+3/4, y+3/4', 'x+3/4, -z+1/4, -y+3/4', 'x+1/4, z+1/4, y+1/4', '-x+3/4, z+3/4, -y+1/4', '-z+1/4, -y+3/4, x+3/4', '-z+3/4, y+3/4, -x+1/4', 'z+3/4, -y+1/4, -x+3/4', 'z+1/4, y+1/4, x+1/4', 'x+1/2, y+1/2, z+1/2', '-x+1, -y+1/2, z+1', '-x+1/2, y+1, -z+1', 'x+1, -y+1, -z+1/2', 'z+1/2, x+1/2, y+1/2', 'z+1, -x+1, -y+1/2', '-z+1, -x+1/2, y+1', '-z+1/2, x+1, -y+1', 'y+1/2, z+1/2, x+1/2', '-y+1/2, z+1, -x+1', 'y+1, -z+1, -x+1/2', '-y+1, -z+1/2, x+1', 'y+5/4, x+3/4, -z+3/4', '-y+5/4, -x+5/4, -z+5/4', 'y+3/4, -x+3/4, z+5/4', '-y+3/4, x+5/4, z+3/4', 'x+5/4, z+3/4, -y+3/4', '-x+3/4, z+5/4, y+3/4', '-x+5/4, -z+5/4, -y+5/4', 'x+3/4, -z+3/4, y+5/4', 'z+5/4, y+3/4, -x+3/4', 'z+3/4, -y+3/4, x+5/4', '-z+3/4, y+5/4, x+3/4', '-z+5/4, -y+5/4, -x+5/4', '-x+1/2, -y+1/2, -z+1/2', 'x+1, y+1/2, -z+1', 'x+1/2, -y+1, z+1', '-x+1, y+1, z+1/2', '-z+1/2, -x+1/2, -y+1/2', '-z+1, x+1, y+1/2', 'z+1, x+1/2, -y+1', 'z+1/2, -x+1, y+1', '-y+1/2, -z+1/2, -x+1/2', 'y+1/2, -z+1, x+1', '-y+1, z+1, x+1/2', 'y+1, z+1/2, -x+1', '-y+3/4, -x+5/4, z+5/4', 'y+3/4, x+3/4, z+3/4', '-y+5/4, x+5/4, -z+3/4', 'y+5/4, -x+3/4, -z+5/4', '-x+3/4, -z+5/4, y+5/4', 'x+5/4, -z+3/4, -y+5/4', 'x+3/4, z+3/4, y+3/4', '-x+5/4, z+5/4, -y+3/4', '-z+3/4, -y+5/4, x+5/4', '-z+5/4, y+5/4, -x+3/4', 'z+5/4, -y+3/4, -x+5/4', 'z+3/4, y+3/4, x+3/4'], ['1/8, y, -y+1/4', '3/8, -y, -y+3/4', '7/8, y+1/2, y+1/4', '5/8, -y+1/2, y+3/4', '-y+1/4, 1/8, y', '-y+3/4, 3/8, -y', 'y+1/4, 7/8, y+1/2', 'y+3/4, 5/8, -y+1/2', 'y, -y+1/4, 1/8', '-y, -y+3/4, 3/8', 'y+1/2, y+1/4, 7/8', '-y+1/2, y+3/4, 5/8', '7/8, -y, y+3/4', '5/8, y, y+1/4', '1/8, -y+1/2, -y+3/4', '3/8, y+1/2, -y+1/4', 'y+3/4, 7/8, -y', 'y+1/4, 5/8, y', '-y+3/4, 1/8, -y+1/2', '-y+1/4, 3/8, y+1/2', '-y, y+3/4, 7/8', 'y, y+1/4, 5/8', '-y+1/2, -y+3/4, 1/8', 'y+1/2, -y+1/4, 3/8', '5/8, y+1/2, -y+3/4', '7/8, -y+1/2, -y+5/4', '11/8, y+1, y+3/4', '9/8, -y+1, y+5/4', '-y+3/4, 5/8, y+1/2', '-y+5/4, 7/8, -y+1/2', 'y+3/4, 11/8, y+1', 'y+5/4, 9/8, -y+1', 'y+1/2, -y+3/4, 5/8', '-y+1/2, -y+5/4, 7/8', 'y+1, y+3/4, 11/8', '-y+1, y+5/4, 9/8', '11/8, -y+1/2, y+5/4', '9/8, y+1/2, y+3/4', '5/8, -y+1, -y+5/4', '7/8, y+1, -y+3/4', 'y+5/4, 11/8, -y+1/2', 'y+3/4, 9/8, y+1/2', '-y+5/4, 5/8, -y+1', '-y+3/4, 7/8, y+1', '-y+1/2, y+5/4, 11/8', 'y+1/2, y+3/4, 9/8', '-y+1, -y+5/4, 5/8', 'y+1, -y+3/4, 7/8'], ['x, 0, 1/4', '-x+1/2, 0, 3/4', '1/4, x, 0', '3/4, -x+1/2, 0', '0, 1/4, x', '0, 3/4, -x+1/2', '3/4, x+1/4, 0', '3/4, -x+3/4, 1/2', 'x+3/4, 1/2, 1/4', '-x+1/4, 0, 1/4', '0, 1/4, -x+1/4', '1/2, 1/4, x+3/4', '-x, 0, 3/4', 'x+1/2, 0, 1/4', '3/4, -x, 0', '1/4, x+1/2, 0', '0, 3/4, -x', '0, 1/4, x+1/2', '1/4, -x+3/4, 0', '1/4, x+1/4, 1/2', '-x+1/4, 1/2, 3/4', 'x+3/4, 0, 3/4', '0, 3/4, x+3/4', '1/2, 3/4, -x+1/4', 'x+1/2, 1/2, 3/4', '-x+1, 1/2, 5/4', '3/4, x+1/2, 1/2', '5/4, -x+1, 1/2', '1/2, 3/4, x+1/2', '1/2, 5/4, -x+1', '5/4, x+3/4, 1/2', '5/4, -x+5/4, 1', 'x+5/4, 1, 3/4', '-x+3/4, 1/2, 3/4', '1/2, 3/4, -x+3/4', '1, 3/4, x+5/4', '-x+1/2, 1/2, 5/4', 'x+1, 1/2, 3/4', '5/4, -x+1/2, 1/2', '3/4, x+1, 1/2', '1/2, 5/4, -x+1/2', '1/2, 3/4, x+1', '3/4, -x+5/4, 1/2', '3/4, x+3/4, 1', '-x+3/4, 1, 5/4', 'x+5/4, 1/2, 5/4', '1/2, 5/4, x+5/4', '1, 5/4, -x+3/4'], ['x, x, x', '-x+1/2, -x, x+1/2', '-x, x+1/2, -x+1/2', 'x+1/2, -x+1/2, -x', 'x+3/4, x+1/4, -x+1/4', '-x+3/4, -x+3/4, -x+3/4', 'x+1/4, -x+1/4, x+3/4', '-x+1/4, x+3/4, x+1/4', '-x, -x, -x', 'x+1/2, x, -x+1/2', 'x, -x+1/2, x+1/2', '-x+1/2, x+1/2, x', '-x+1/4, -x+3/4, x+3/4', 'x+1/4, x+1/4, x+1/4', '-x+3/4, x+3/4, -x+1/4', 'x+3/4, -x+1/4, -x+3/4', 'x+1/2, x+1/2, x+1/2', '-x+1, -x+1/2, x+1', '-x+1/2, x+1, -x+1', 'x+1, -x+1, -x+1/2', 'x+5/4, x+3/4, -x+3/4', '-x+5/4, -x+5/4, -x+5/4', 'x+3/4, -x+3/4, x+5/4', '-x+3/4, x+5/4, x+3/4', '-x+1/2, -x+1/2, -x+1/2', 'x+1, x+1/2, -x+1', 'x+1/2, -x+1, x+1', '-x+1, x+1, x+1/2', '-x+3/4, -x+5/4, x+5/4', 'x+3/4, x+3/4, x+3/4', '-x+5/4, x+5/4, -x+3/4', 'x+5/4, -x+3/4, -x+5/4'], ['3/8, 0, 1/4', '1/8, 0, 3/4', '1/4, 3/8, 0', '3/4, 1/8, 0', '0, 1/4, 3/8', '0, 3/4, 1/8', '3/4, 5/8, 0', '3/4, 3/8, 1/2', '1/8, 1/2, 1/4', '7/8, 0, 1/4', '0, 1/4, 7/8', '1/2, 1/4, 1/8', '7/8, 1/2, 3/4', '5/8, 1/2, 5/4', '3/4, 7/8, 1/2', '5/4, 5/8, 1/2', '1/2, 3/4, 7/8', '1/2, 5/4, 5/8', '5/4, 9/8, 1/2', '5/4, 7/8, 1', '5/8, 1, 3/4', '11/8, 1/2, 3/4', '1/2, 3/4, 11/8', '1, 3/4, 5/8'], ['1/8, 0, 1/4', '3/8, 0, 3/4', '1/4, 1/8, 0', '3/4, 3/8, 0', '0, 1/4, 1/8', '0, 3/4, 3/8', '7/8, 0, 3/4', '5/8, 0, 1/4', '3/4, 7/8, 0', '1/4, 5/8, 0', '0, 3/4, 7/8', '0, 1/4, 5/8', '5/8, 1/2, 3/4', '7/8, 1/2, 5/4', '3/4, 5/8, 1/2', '5/4, 7/8, 1/2', '1/2, 3/4, 5/8', '1/2, 5/4, 7/8', '11/8, 1/2, 5/4', '9/8, 1/2, 3/4', '5/4, 11/8, 1/2', '3/4, 9/8, 1/2', '1/2, 5/4, 11/8', '1/2, 3/4, 9/8'], ['1/8, 1/8, 1/8', '3/8, 7/8, 5/8', '7/8, 5/8, 3/8', '5/8, 3/8, 7/8', '7/8, 7/8, 7/8', '5/8, 1/8, 3/8', '1/8, 3/8, 5/8', '3/8, 5/8, 1/8', '5/8, 5/8, 5/8', '7/8, 11/8, 9/8', '11/8, 9/8, 7/8', '9/8, 7/8, 11/8', '11/8, 11/8, 11/8', '9/8, 5/8, 7/8', '5/8, 7/8, 9/8', '7/8, 9/8, 5/8'], ['0, 0, 0', '1/2, 0, 1/2', '0, 1/2, 1/2', '1/2, 1/2, 0', '3/4, 1/4, 1/4', '3/4, 3/4, 3/4', '1/4, 1/4, 3/4', '1/4, 3/4, 1/4', '1/2, 1/2, 1/2', '1, 1/2, 1', '1/2, 1, 1', '1, 1, 1/2', '5/4, 3/4, 3/4', '5/4, 5/4, 5/4', '3/4, 3/4, 5/4', '3/4, 5/4, 3/4']]" diff --git a/crystalformerapp/data/wyckoff_symbols.csv b/crystalformerapp/data/wyckoff_symbols.csv new file mode 100644 index 0000000..5a6cb0f --- /dev/null +++ b/crystalformerapp/data/wyckoff_symbols.csv @@ -0,0 +1,231 @@ +Space Group,Wyckoff Positions +1,['1a'] +2,"['1a', '1b', '1c', '1d', '1e', '1f', '1g', '1h', '2i']" +3,"['1a', '1b', '1c', '1d', '2e']" +4,['2a'] +5,"['2a', '2b', '4c']" +6,"['1a', '1b', '2c']" +7,['2a'] +8,"['2a', '4b']" +9,['4a'] +10,"['1a', '1b', '1c', '1d', '1e', '1f', '1g', '1h', '2i', '2j', '2k', '2l', '2m', '2n', '4o']" +11,"['2a', '2b', '2c', '2d', '2e', '4f']" +12,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '8j']" +13,"['2a', '2b', '2c', '2d', '2e', '2f', '4g']" +14,"['2a', '2b', '2c', '2d', '4e']" +15,"['4a', '4b', '4c', '4d', '4e', '8f']" +16,"['1a', '1b', '1c', '1d', '1e', '1f', '1g', '1h', '2i', '2j', '2k', '2l', '2m', '2n', '2o', '2p', '2q', '2r', '2s', '2t', '4u']" +17,"['2a', '2b', '2c', '2d', '4e']" +18,"['2a', '2b', '4c']" +19,['4a'] +20,"['4a', '4b', '8c']" +21,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '4k', '8l']" +22,"['4a', '4b', '4c', '4d', '8e', '8f', '8g', '8h', '8i', '8j', '16k']" +23,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '8k']" +24,"['4a', '4b', '4c', '8d']" +25,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '2h', '4i']" +26,"['2a', '2b', '4c']" +27,"['2a', '2b', '2c', '2d', '4e']" +28,"['2a', '2b', '2c', '4d']" +29,['4a'] +30,"['2a', '2b', '4c']" +31,"['2a', '4b']" +32,"['2a', '2b', '4c']" +33,['4a'] +34,"['2a', '2b', '4c']" +35,"['2a', '2b', '4c', '4d', '4e', '8f']" +36,"['4a', '8b']" +37,"['4a', '4b', '4c', '8d']" +38,"['2a', '2b', '4c', '4d', '4e', '8f']" +39,"['4a', '4b', '4c', '8d']" +40,"['4a', '4b', '8c']" +41,"['4a', '8b']" +42,"['4a', '8b', '8c', '8d', '16e']" +43,"['8a', '16b']" +44,"['2a', '2b', '4c', '4d', '8e']" +45,"['4a', '4b', '8c']" +46,"['4a', '4b', '8c']" +47,"['1a', '1b', '1c', '1d', '1e', '1f', '1g', '1h', '2i', '2j', '2k', '2l', '2m', '2n', '2o', '2p', '2q', '2r', '2s', '2t', '4u', '4v', '4w', '4x', '4y', '4z', '8A']" +48,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '4k', '4l', '8m']" +49,"['2a', '2b', '2c', '2d', '2e', '2f', '2g', '2h', '4i', '4j', '4k', '4l', '4m', '4n', '4o', '4p', '4q', '8r']" +50,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '4k', '4l', '8m']" +51,"['2a', '2b', '2c', '2d', '2e', '2f', '4g', '4h', '4i', '4j', '4k', '8l']" +52,"['4a', '4b', '4c', '4d', '8e']" +53,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i']" +54,"['4a', '4b', '4c', '4d', '4e', '8f']" +55,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i']" +56,"['4a', '4b', '4c', '4d', '8e']" +57,"['4a', '4b', '4c', '4d', '8e']" +58,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '8h']" +59,"['2a', '2b', '4c', '4d', '4e', '4f', '8g']" +60,"['4a', '4b', '4c', '8d']" +61,"['4a', '4b', '8c']" +62,"['4a', '4b', '4c', '8d']" +63,"['4a', '4b', '4c', '8d', '8e', '8f', '8g', '16h']" +64,"['4a', '4b', '8c', '8d', '8e', '8f', '16g']" +65,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '4k', '4l', '8m', '8n', '8o', '8p', '8q', '16r']" +66,"['4a', '4b', '4c', '4d', '4e', '4f', '8g', '8h', '8i', '8j', '8k', '8l', '16m']" +67,"['4a', '4b', '4c', '4d', '4e', '4f', '4g', '8h', '8i', '8j', '8k', '8l', '8m', '8n', '16o']" +68,"['4a', '4b', '8c', '8d', '8e', '8f', '8g', '8h', '16i']" +69,"['4a', '4b', '8c', '8d', '8e', '8f', '8g', '8h', '8i', '16j', '16k', '16l', '16m', '16n', '16o', '32p']" +70,"['8a', '8b', '16c', '16d', '16e', '16f', '16g', '32h']" +71,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '8k', '8l', '8m', '8n', '16o']" +72,"['4a', '4b', '4c', '4d', '8e', '8f', '8g', '8h', '8i', '8j', '16k']" +73,"['8a', '8b', '8c', '8d', '8e', '16f']" +74,"['4a', '4b', '4c', '4d', '4e', '8f', '8g', '8h', '8i', '16j']" +75,"['1a', '1b', '2c', '4d']" +76,['4a'] +77,"['2a', '2b', '2c', '4d']" +78,['4a'] +79,"['2a', '4b', '8c']" +80,"['4a', '8b']" +81,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '4h']" +82,"['2a', '2b', '2c', '2d', '4e', '4f', '8g']" +83,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '2h', '4i', '4j', '4k', '8l']" +84,"['2a', '2b', '2c', '2d', '2e', '2f', '4g', '4h', '4i', '4j', '8k']" +85,"['2a', '2b', '2c', '4d', '4e', '4f', '8g']" +86,"['2a', '2b', '4c', '4d', '4e', '4f', '8g']" +87,"['2a', '2b', '4c', '4d', '4e', '8f', '8g', '8h', '16i']" +88,"['4a', '4b', '8c', '8d', '8e', '16f']" +89,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '2h', '4i', '4j', '4k', '4l', '4m', '4n', '4o', '8p']" +90,"['2a', '2b', '2c', '4d', '4e', '4f', '8g']" +91,"['4a', '4b', '4c', '8d']" +92,"['4a', '8b']" +93,"['2a', '2b', '2c', '2d', '2e', '2f', '4g', '4h', '4i', '4j', '4k', '4l', '4m', '4n', '4o', '8p']" +94,"['2a', '2b', '4c', '4d', '4e', '4f', '8g']" +95,"['4a', '4b', '4c', '8d']" +96,"['4a', '8b']" +97,"['2a', '2b', '4c', '4d', '4e', '8f', '8g', '8h', '8i', '8j', '16k']" +98,"['4a', '4b', '8c', '8d', '8e', '8f', '16g']" +99,"['1a', '1b', '2c', '4d', '4e', '4f', '8g']" +100,"['2a', '2b', '4c', '8d']" +101,"['2a', '2b', '4c', '4d', '8e']" +102,"['2a', '4b', '4c', '8d']" +103,"['2a', '2b', '4c', '8d']" +104,"['2a', '4b', '8c']" +105,"['2a', '2b', '2c', '4d', '4e', '8f']" +106,"['4a', '4b', '8c']" +107,"['2a', '4b', '8c', '8d', '16e']" +108,"['4a', '4b', '8c', '16d']" +109,"['4a', '8b', '16c']" +110,"['8a', '16b']" +111,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '2h', '4i', '4j', '4k', '4l', '4m', '4n', '8o']" +112,"['2a', '2b', '2c', '2d', '2e', '2f', '4g', '4h', '4i', '4j', '4k', '4l', '4m', '8n']" +113,"['2a', '2b', '2c', '4d', '4e', '8f']" +114,"['2a', '2b', '4c', '4d', '8e']" +115,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '4h', '4i', '4j', '4k', '8l']" +116,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '8j']" +117,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i']" +118,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i']" +119,"['2a', '2b', '2c', '2d', '4e', '4f', '8g', '8h', '8i', '16j']" +120,"['4a', '4b', '4c', '4d', '8e', '8f', '8g', '8h', '16i']" +121,"['2a', '2b', '4c', '4d', '4e', '8f', '8g', '8h', '8i', '16j']" +122,"['4a', '4b', '8c', '8d', '16e']" +123,"['1a', '1b', '1c', '1d', '2e', '2f', '2g', '2h', '4i', '4j', '4k', '4l', '4m', '4n', '4o', '8p', '8q', '8r', '8s', '8t', '16u']" +124,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i', '8j', '8k', '8l', '8m', '16n']" +125,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i', '8j', '8k', '8l', '8m', '16n']" +126,"['2a', '2b', '4c', '4d', '4e', '8f', '8g', '8h', '8i', '8j', '16k']" +127,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '8i', '8j', '8k', '16l']" +128,"['2a', '2b', '4c', '4d', '4e', '8f', '8g', '8h', '16i']" +129,"['2a', '2b', '2c', '4d', '4e', '4f', '8g', '8h', '8i', '8j', '16k']" +130,"['4a', '4b', '4c', '8d', '8e', '8f', '16g']" +131,"['2a', '2b', '2c', '2d', '2e', '2f', '4g', '4h', '4i', '4j', '4k', '4l', '4m', '8n', '8o', '8p', '8q', '16r']" +132,"['2a', '2b', '2c', '2d', '4e', '4f', '4g', '4h', '4i', '4j', '8k', '8l', '8m', '8n', '8o', '16p']" +133,"['4a', '4b', '4c', '4d', '8e', '8f', '8g', '8h', '8i', '8j', '16k']" +134,"['2a', '2b', '4c', '4d', '4e', '4f', '4g', '8h', '8i', '8j', '8k', '8l', '8m', '16n']" +135,"['4a', '4b', '4c', '4d', '8e', '8f', '8g', '8h', '16i']" +136,"['2a', '2b', '4c', '4d', '4e', '4f', '4g', '8h', '8i', '8j', '16k']" +137,"['2a', '2b', '4c', '4d', '8e', '8f', '8g', '16h']" +138,"['4a', '4b', '4c', '4d', '4e', '8f', '8g', '8h', '8i', '16j']" +139,"['2a', '2b', '4c', '4d', '4e', '8f', '8g', '8h', '8i', '8j', '16k', '16l', '16m', '16n', '32o']" +140,"['4a', '4b', '4c', '4d', '8e', '8f', '8g', '8h', '16i', '16j', '16k', '16l', '32m']" +141,"['4a', '4b', '8c', '8d', '8e', '16f', '16g', '16h', '32i']" +142,"['8a', '8b', '16c', '16d', '16e', '16f', '32g']" +143,"['1a', '1b', '1c', '3d']" +144,['3a'] +145,['3a'] +146,"['3a', '9b']" +147,"['1a', '1b', '2c', '2d', '3e', '3f', '6g']" +148,"['3a', '3b', '6c', '9d', '9e', '18f']" +149,"['1a', '1b', '1c', '1d', '1e', '1f', '2g', '2h', '2i', '3j', '3k', '6l']" +150,"['1a', '1b', '2c', '2d', '3e', '3f', '6g']" +151,"['3a', '3b', '6c']" +152,"['3a', '3b', '6c']" +153,"['3a', '3b', '6c']" +154,"['3a', '3b', '6c']" +155,"['3a', '3b', '6c', '9d', '9e', '18f']" +156,"['1a', '1b', '1c', '3d', '6e']" +157,"['1a', '2b', '3c', '6d']" +158,"['2a', '2b', '2c', '6d']" +159,"['2a', '2b', '6c']" +160,"['3a', '9b', '18c']" +161,"['6a', '18b']" +162,"['1a', '1b', '2c', '2d', '2e', '3f', '3g', '4h', '6i', '6j', '6k', '12l']" +163,"['2a', '2b', '2c', '2d', '4e', '4f', '6g', '6h', '12i']" +164,"['1a', '1b', '2c', '2d', '3e', '3f', '6g', '6h', '6i', '12j']" +165,"['2a', '2b', '4c', '4d', '6e', '6f', '12g']" +166,"['3a', '3b', '6c', '9d', '9e', '18f', '18g', '18h', '36i']" +167,"['6a', '6b', '12c', '18d', '18e', '36f']" +168,"['1a', '2b', '3c', '6d']" +169,['6a'] +170,['6a'] +171,"['3a', '3b', '6c']" +172,"['3a', '3b', '6c']" +173,"['2a', '2b', '6c']" +174,"['1a', '1b', '1c', '1d', '1e', '1f', '2g', '2h', '2i', '3j', '3k', '6l']" +175,"['1a', '1b', '2c', '2d', '2e', '3f', '3g', '4h', '6i', '6j', '6k', '12l']" +176,"['2a', '2b', '2c', '2d', '4e', '4f', '6g', '6h', '12i']" +177,"['1a', '1b', '2c', '2d', '2e', '3f', '3g', '4h', '6i', '6j', '6k', '6l', '6m', '12n']" +178,"['6a', '6b', '12c']" +179,"['6a', '6b', '12c']" +180,"['3a', '3b', '3c', '3d', '6e', '6f', '6g', '6h', '6i', '6j', '12k']" +181,"['3a', '3b', '3c', '3d', '6e', '6f', '6g', '6h', '6i', '6j', '12k']" +182,"['2a', '2b', '2c', '2d', '4e', '4f', '6g', '6h', '12i']" +183,"['1a', '2b', '3c', '6d', '6e', '12f']" +184,"['2a', '4b', '6c', '12d']" +185,"['2a', '4b', '6c', '12d']" +186,"['2a', '2b', '6c', '12d']" +187,"['1a', '1b', '1c', '1d', '1e', '1f', '2g', '2h', '2i', '3j', '3k', '6l', '6m', '6n', '12o']" +188,"['2a', '2b', '2c', '2d', '2e', '2f', '4g', '4h', '4i', '6j', '6k', '12l']" +189,"['1a', '1b', '2c', '2d', '2e', '3f', '3g', '4h', '6i', '6j', '6k', '12l']" +190,"['2a', '2b', '2c', '2d', '4e', '4f', '6g', '6h', '12i']" +191,"['1a', '1b', '2c', '2d', '2e', '3f', '3g', '4h', '6i', '6j', '6k', '6l', '6m', '12n', '12o', '12p', '12q', '24r']" +192,"['2a', '2b', '4c', '4d', '4e', '6f', '6g', '8h', '12i', '12j', '12k', '12l', '24m']" +193,"['2a', '2b', '4c', '4d', '4e', '6f', '6g', '8h', '12i', '12j', '12k', '24l']" +194,"['2a', '2b', '2c', '2d', '4e', '4f', '6g', '6h', '12i', '12j', '12k', '24l']" +195,"['1a', '1b', '3c', '3d', '4e', '6f', '6g', '6h', '6i', '12j']" +196,"['4a', '4b', '4c', '4d', '16e', '24f', '24g', '48h']" +197,"['2a', '6b', '8c', '12d', '12e', '24f']" +198,"['4a', '12b']" +199,"['8a', '12b', '24c']" +200,"['1a', '1b', '3c', '3d', '6e', '6f', '6g', '6h', '8i', '12j', '12k', '24l']" +201,"['2a', '4b', '4c', '6d', '8e', '12f', '12g', '24h']" +202,"['4a', '4b', '8c', '24d', '24e', '32f', '48g', '48h', '96i']" +203,"['8a', '8b', '16c', '16d', '32e', '48f', '96g']" +204,"['2a', '6b', '8c', '12d', '12e', '16f', '24g', '48h']" +205,"['4a', '4b', '8c', '24d']" +206,"['8a', '8b', '16c', '24d', '48e']" +207,"['1a', '1b', '3c', '3d', '6e', '6f', '8g', '12h', '12i', '12j', '24k']" +208,"['2a', '4b', '4c', '6d', '6e', '6f', '8g', '12h', '12i', '12j', '12k', '12l', '24m']" +209,"['4a', '4b', '8c', '24d', '24e', '32f', '48g', '48h', '48i', '96j']" +210,"['8a', '8b', '16c', '16d', '32e', '48f', '48g', '96h']" +211,"['2a', '6b', '8c', '12d', '12e', '16f', '24g', '24h', '24i', '48j']" +212,"['4a', '4b', '8c', '12d', '24e']" +213,"['4a', '4b', '8c', '12d', '24e']" +214,"['8a', '8b', '12c', '12d', '16e', '24f', '24g', '24h', '48i']" +215,"['1a', '1b', '3c', '3d', '4e', '6f', '6g', '12h', '12i', '24j']" +216,"['4a', '4b', '4c', '4d', '16e', '24f', '24g', '48h', '96i']" +217,"['2a', '6b', '8c', '12d', '12e', '24f', '24g', '48h']" +218,"['2a', '6b', '6c', '6d', '8e', '12f', '12g', '12h', '24i']" +219,"['8a', '8b', '24c', '24d', '32e', '48f', '48g', '96h']" +220,"['12a', '12b', '16c', '24d', '48e']" +221,"['1a', '1b', '3c', '3d', '6e', '6f', '8g', '12h', '12i', '12j', '24k', '24l', '24m', '48n']" +222,"['2a', '6b', '8c', '12d', '12e', '16f', '24g', '24h', '48i']" +223,"['2a', '6b', '6c', '6d', '8e', '12f', '12g', '12h', '16i', '24j', '24k', '48l']" +224,"['2a', '4b', '4c', '6d', '8e', '12f', '12g', '24h', '24i', '24j', '24k', '48l']" +225,"['4a', '4b', '8c', '24d', '24e', '32f', '48g', '48h', '48i', '96j', '96k', '192l']" +226,"['8a', '8b', '24c', '24d', '48e', '48f', '64g', '96h', '96i', '192j']" +227,"['8a', '8b', '16c', '16d', '32e', '48f', '96g', '96h', '192i']" +228,"['16a', '32b', '32c', '48d', '64e', '96f', '96g', '192h']" +229,"['2a', '6b', '8c', '12d', '12e', '16f', '24g', '24h', '48i', '48j', '48k', '96l']" +230,"['16a', '16b', '24c', '24d', '32e', '48f', '48g', '96h']" diff --git a/crystalformerapp/gr_frontend.py b/crystalformerapp/gr_frontend.py new file mode 100644 index 0000000..e42638d --- /dev/null +++ b/crystalformerapp/gr_frontend.py @@ -0,0 +1,151 @@ +import gradio as gr +from gradio_materialviewer import MaterialViewer +import tempfile +import os +import sys + +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from simple_op import run_crystalformer +from op import run_op, run_op_gpu + +current_tempdir = None # Global variable to store the current temporary directory + +def main(): + with gr.Blocks() as app: + with gr.Tab(label="Quick Start Mode"): + with gr.Row(): + with gr.Column(): + spacegroup = gr.Slider(label="Spacegroup", minimum=1, maximum=230, value=225, step=1) + elements = gr.Textbox(label="Elements", value="C") + with gr.Column(): + temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=2.0, value=1.0, step=0.1) + seed = gr.Number(label="Seed", value=42) + + with gr.Row(): + generate_btn = gr.Button("Generate Structure") + clear_btn = gr.Button("Clear Inputs") + + output_file = gr.File(label="CIF File") + material_viewer = MaterialViewer(height=480, materialFile="", format='cif') + + def generate_and_display_structure(sp, el, temp, sd): + global current_tempdir + if current_tempdir: + current_tempdir.cleanup() # Clean up the previous temporary directory + current_tempdir = tempfile.TemporaryDirectory(dir=".") # Create a new temporary directory + cif_file_path = run_crystalformer(sp, el, temp, sd, current_tempdir.name) + with open(cif_file_path, 'r') as ff: + cif_content = "".join(ff.readlines()) + return cif_file_path, MaterialViewer(materialFile=cif_content, format='cif', height=480) + + generate_btn.click( + fn=generate_and_display_structure, + inputs=[spacegroup, elements, temperature, seed], + outputs=[output_file, material_viewer] + ) + + clear_btn.click( + fn=lambda: (225, "C", 1.0, 42), + inputs=None, + outputs=[spacegroup, elements, temperature, seed] + ) + + gr.Markdown(""" + # Quick Start Mode + + Generate crystal structures with Quick Start Mode. + + ## Instructions: + 1. Enter the spacegroup number + 2. Specify the elements (comma-separated) + 3. Adjust the temperature + 4. Set a random seed (optional) + 5. Click 'Generate Structure' to create the CIF file + """) + + with gr.Tab(label="Research Mode"): + with gr.Row(): + with gr.Column(): + spacegroup = gr.Slider(label="Spacegroup", minimum=1, maximum=230, value=225, step=1) + elements = gr.Textbox(label="Elements", value="C") + wyckoff = gr.Textbox(label="Wyckoff", value="a") + with gr.Column(): + seed = gr.Number(label="Seed", value=42) + temperature = gr.Slider(label="Temperature", minimum=0.5, maximum=1.5, value=1.0, step=0.1) + T1 = gr.Slider(label="T1", minimum=100, maximum=100000000, value=100, step=100) + nsweeps = gr.Slider(label="nsweeps", minimum=0, maximum=20, value=10, step=1) + with gr.Row(): + access_key = gr.Textbox(label="Access Key") + project_id = gr.Textbox(label="Project ID") + machine_type = gr.Dropdown(label="Machine Type", choices=[ + "1 * NVIDIA T4_16g", + "1 * NVIDIA V100_32g", + "c12_m64_1 * NVIDIA L4", + ]) + + with gr.Row(): + generateWeb_btn = gr.Button("Generate Structure") + generateGPU_btn = gr.Button("Generate Structure on GPU machines") + clear_btn = gr.Button("Clear Inputs") + + output_file = gr.File(label="CIF File") + material_viewer = MaterialViewer(height=480, materialFile="", format='cif') + + def generate_and_display_structure_web(sp, el, wy, temp, sd, T1, ns): + global current_tempdir + if current_tempdir: + current_tempdir.cleanup() # Clean up the previous temporary directory + current_tempdir = tempfile.TemporaryDirectory(dir=".") # Create a new temporary directory + cif_file_path = run_op(sp, el, wy, temp, sd, T1, ns, current_tempdir.name) + with open(cif_file_path, 'r') as ff: + cif_content = "".join(ff.readlines()) + return cif_file_path, MaterialViewer(materialFile=cif_content, format='cif', height=480) + + generateWeb_btn.click( + fn=generate_and_display_structure_web, + inputs=[spacegroup, elements, wyckoff, temperature, seed, T1, nsweeps], + outputs=[output_file, material_viewer] + ) + + def generate_and_display_structure_gpu(sp, el, wy, temp, sd, T1, ns, ak, pid, mt): + global current_tempdir + if current_tempdir: + current_tempdir.cleanup() # Clean up the previous temporary directory + current_tempdir = tempfile.TemporaryDirectory(dir=".") # Create a new temporary directory + cif_file_path = run_op_gpu(sp, el, wy, temp, sd, T1, ns, ak, pid, mt, current_tempdir.name) + with open(cif_file_path, 'r') as ff: + cif_content = "".join(ff.readlines()) + return cif_file_path, MaterialViewer(materialFile=cif_content, format='cif', height=480) + + generateGPU_btn.click( + fn=generate_and_display_structure_gpu, + inputs=[spacegroup, elements, wyckoff, temperature, seed, T1, nsweeps, access_key, project_id, machine_type], + outputs=[output_file, material_viewer] + ) + + clear_btn.click( + fn=lambda: (225, "C", 1.0, 42), + inputs=None, + outputs=[spacegroup, elements, temperature, seed] + ) + + gr.Markdown(""" + # Research Mode + + Generate crystal structures with Research Mode. + + ## Instructions: + - **seed**: random seed to sample the crystal structure + - **spacegroup**: control the space group of generated crystals + - **temperature**: modifies the probability distribution + - **T1**: the temperature of sampling the first atom type + - **elements**: control the elements in the generating process. Note that you need to enter the elements separated by spaces, i.e., Ba Ti O, if the elements string is none, the model will not limit the elements + - **wyckoff**: control the Wyckoff letters in the generation. Note that you need to enter the Wyckoff letters separated by spaces, i.e., a c, if the Wyckoff is none, the model will not limit the wyckoff letter. + - **nsweeps**: control the steps of mcmc to refine the generated structures + """) + + app.launch(share=True) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/imgs/output.gif b/crystalformerapp/imgs/output.gif similarity index 100% rename from imgs/output.gif rename to crystalformerapp/imgs/output.gif diff --git a/crystalformerapp/launching.py b/crystalformerapp/launching.py new file mode 100644 index 0000000..59bf376 --- /dev/null +++ b/crystalformerapp/launching.py @@ -0,0 +1,48 @@ +import json +import shutil +from pathlib import Path +import os +import dp.launching.typing.addon.ui as ui +import traceback +from pprint import pprint + +from dp.launching.cli import (SubParser, default_exception_handler, + run_sp_and_exit, to_runner) +from dp.launching.report import (AutoReportElement, MetricsChartReportElement, + Report, ReportSection) +from dp.launching.typing import (BaseModel, BohriumProjectId, + BohriumUsername, Boolean, Enum, Field, Float, + InputFilePath, Int, List, Literal, + Optional, OutputDirectory, String, DataSet, Union) +from dp.launching.typing.addon.sysmbol import Equal + + +class CrystalformerOptions(BaseModel): + spacegroup: Int = Field(ge=1, le=230, description="Space group number") + elements: String = Field(description="Elements to include, separated by spaces") + temperature: Float = Field(ge=0.5, le=1.5, default=1.0, description="Temperature for generation") + seed: Int = Field(default=42, description="Random seed") + + +def crystalformer_runner(opts: CrystalformerOptions) -> int: + try: + run_crystalformer( + spacegroup=opts.spacegroup, + elements=opts.elements, + temperature=opts.temperature, + seed=opts.seed + ) + return 0 + except Exception as exc: + print(str(exc)) + traceback.print_exc() + return 1 + +def to_parser(): + return { + "1": SubParser(CrystalformerOptions, crystalformer_runner, "Run Crystalformer") + } + + +if __name__ == '__main__': + run_sp_and_exit(to_parser(), description="Crystal Former", version="0.1.0", exception_handler=default_exception_handler) \ No newline at end of file diff --git a/crystalformerapp/model/README.md b/crystalformerapp/model/README.md new file mode 100644 index 0000000..3df1aac --- /dev/null +++ b/crystalformerapp/model/README.md @@ -0,0 +1,32 @@ +## Pretrained model + +The pre-trained model is available on [Google Drive](https://drive.google.com/file/d/1koHC6n38BqsY2_z3xHTi40HcFbVesUKd/view?usp=sharing). It can be downloaded using `wget`, `gdown`, or just by clicking the link. + + +## Model Parameters + +```python +params, transformer = make_transformer( + key=jax.random.PRNGKey(42), + Nf=5, + Kx=16, + Kl=4, + n_max=21, + h0_size=256, + num_layers=16, + num_heads=16, + key_size=64, + model_size=64, + embed_size=32, + atom_types=119, + wyck_types=28, + dropout_rate=0.5, + widening_factor=4, + sigmamin=1e-3 +) +``` + +## Training dataset + +MP-20 (Jain et al., 2013): contains 45k general inorganic materials, including most experimentally known materials with no more than 20 atoms in unit cell. +More details can be found in the [CDVAE repository](https://github.com/txie-93/cdvae/tree/main/data/mp_20). \ No newline at end of file diff --git a/crystalformerapp/model/config.yaml b/crystalformerapp/model/config.yaml new file mode 100644 index 0000000..3a1d491 --- /dev/null +++ b/crystalformerapp/model/config.yaml @@ -0,0 +1,60 @@ +hydra: + run: + dir: "outputs/${training_name}_${physics_name}_${loss_name}_${transformer_name}" + sweep: + dir: "outputs/${training_name}_${physics_name}_${loss_name}_${transformer_name}" + +# training_parameters: +epochs: 10000 +batchsize: 100 +lr: 0.0001 +lr_decay: 0.0 +weight_decay: 0.0 +clip_grad: 1.0 +optimizer: adam +folder: "./" +restore_path: null +training_name: "${folder}${optimizer}_bs_${batchsize}_\ + lr_${lr}_decay_${lr_decay}_clip_${clip_grad}" + +# dataset: +train_path: "/data/zdcao/crystal_gpt/dataset/mp_20/train.csv" +valid_path: "/data/zdcao/crystal_gpt/dataset/mp_20/val.csv" +test_path: "/data/zdcao/crystal_gpt/dataset/mp_20/test.csv" + +# transformer_parameters: +Nf: 5 # number of frequencies for fc +Kx: 16 # number of modes in x +Kl: 4 # number of modes in lattice +h0_size: 256 # hidden layer dimension for the first atom, 0 means we simply use a table for first aw_logit') +transformer_layers: 16 # The number of layers in transformer +num_heads: 16 # The number of heads +key_size: 64 # The key size +model_size: 64 # The model size +embed_size: 32 # The enbedding size +dropout_rate: 0.5 # The dropout rate +transformer_name: "Nf_${Nf}_Kx_${Kx}_Kl_${Kl}_\ + h0_${h0_size}_l_${transformer_layers}_H_${num_heads}_\ + k_${key_size}_m_${model_size}_e_${embed_size}_drop_${dropout_rate}" + +# loss_parameters: +lamb_a: 1.0 # weight for the a part relative to fc +lamb_w: 1.0 # weight for the w part relative to fc +lamb_l: 1.0 # weight for the lattice part relative to fc +loss_name: "a_${lamb_a}_w_${lamb_w}_l_${lamb_l}" + +# physics_parameters: +n_max: 21 # The maximum number of atoms in the cell +atom_types: 119 # Atom types including the padded atoms +wyck_types: 28 # Number of possible multiplicites including 0 +physics_name: "A_${atom_types}_W_${wyck_types}_N_${n_max}" + +# sampling_parameters: +spacegroup: null # Since the exact value is not provided, null is used +elements: null # List format will be needed when specifying elements, e.g., [Bi, Ti, O] +top_p: 1.0 # 1.0 means un-modified logits, smaller value of p give give less diverse samples +temperature: 1.0 # temperature used for sampling +num_io_process: 40 # number of process used in multiprocessing io +num_samples: 1000 # number of test samples +use_foriloop: true # false for not using the fori_loop, true if specified +output_filename: "output.csv" # outfile to save sampled structures diff --git a/crystalformerapp/model/epoch_009800.pkl b/crystalformerapp/model/epoch_009800.pkl new file mode 100644 index 0000000..9a05612 Binary files /dev/null and b/crystalformerapp/model/epoch_009800.pkl differ diff --git a/crystalformerapp/op.py b/crystalformerapp/op.py new file mode 100644 index 0000000..c60ac3c --- /dev/null +++ b/crystalformerapp/op.py @@ -0,0 +1,216 @@ +import gdown +import sys +import yaml +import os +import datetime +import jax +import jax.numpy as jnp +from jax.flatten_util import ravel_pytree + +from jax.lib import xla_bridge +# Check if GPU is available +try: + if xla_bridge.get_backend().platform == 'gpu': + print("GPU is available. Using GPU.") + else: + raise RuntimeError("No GPU available, switching to CPU.") +except RuntimeError as e: + print(e) + os.environ["JAX_PLATFORMS"] = "cpu" + jax.config.update("jax_platform_name", "cpu") + print("Changed platform to CPU.") + +# from hydra import initialize, compose +import numpy as np +import ipywidgets as widgets +from pymatgen.core import Structure, Lattice +from weas_widget import WeasWidget + +import os +import sys +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from crystalformerapp import src +from src.sample import sample_crystal, make_update_lattice +from src.elements import element_dict, element_list +from scripts.awl2struct import get_struct_from_lawx +from src.utils import letter_to_number +from src.mcmc import make_mcmc_step +from src.loss import make_loss_fn + +from src.checkpoint import find_ckpt_filename +from src.transformer import make_transformer + +output = "epoch_009800.pkl" + + +current_dir = os.path.dirname(__file__) +file_path = os.path.join(current_dir, "model", "config.yaml") + +with open(file_path) as stream: + args = yaml.safe_load(stream) + + +class MyObject: + def __init__(self, d=None): + for key, value in d.items(): + setattr(self, key, value) + +args = MyObject(args) +key = jax.random.PRNGKey(42) +params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + 4, 8, + 32, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + 0.3) + +print("\n========== Load checkpoint==========") +restore_path = "./" +ckpt_filename, epoch_finished = find_ckpt_filename(restore_path) +if ckpt_filename is not None: + print("Load checkpoint file: %s, epoch finished: %g" %(ckpt_filename, epoch_finished)) + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] +else: + print("No checkpoint file found. Start from scratch.") + +print ("# of transformer params", ravel_pytree(params)[0].size) + +jax.config.update("jax_enable_x64", True) # to get off compilation warning, and to prevent sample nan lattice +loss_fn, logp_fn = make_loss_fn(args.n_max, args.atom_types, args.wyck_types, args.Kx, args.Kl, transformer, args.lamb_a, args.lamb_w, args.lamb_l) + + +def run_op( + spacegroup, elements, wyckoff, + temperature, seed, T1, nsweeps, + tempdir +): + top_p = 1 + mc_width = 0.1 + n_sample = 1 + + elements = elements.split() + if elements is not None: + idx = [element_dict[e] for e in elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + print ('sampling structure formed by these elements:', elements) + print (atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) # we will do nothing to a_logit in sampling + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + + wyckoff = wyckoff.split() + if wyckoff is not None: + idx = [letter_to_number(w) for w in wyckoff] + # padding 0 until the length is args.n_max + w_mask = idx + [0]*(args.n_max -len(idx)) + print(w_mask) + w_mask = jnp.array(w_mask, dtype=int) + print ('sampling structure formed by these Wyckoff positions:', wyckoff) + print (w_mask) + else: + w_mask = None + + temperature = jnp.array(temperature, dtype=float) + constraints = jnp.arange(0, args.n_max, 1) + + mc_steps = nsweeps * args.n_max + print("mc_steps", mc_steps) + mcmc = make_mcmc_step(params, n_max=args.n_max, atom_types=args.atom_types, atom_mask=atom_mask, constraints=constraints) + update_lattice = make_update_lattice(transformer, params, args.atom_types, args.Kl, args.top_p, args.temperature) + + key = jax.random.PRNGKey(seed) + key, subkey = jax.random.split(key) + XYZ, A, W, M, L = sample_crystal(subkey, transformer, params, args.n_max, n_sample, args.atom_types, args.wyck_types, args.Kx, args.Kl, spacegroup, w_mask, atom_mask, top_p, temperature, T1, constraints) + G = jnp.array([spacegroup for i in range(len(L))]) + x = (G, L, XYZ, A, W) + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x, key=subkey, mc_steps=mc_steps, mc_width=mc_width) + print("acc", acc) + + G, L, XYZ, A, W = x + key, subkey = jax.random.split(key) + L = update_lattice(subkey, G, XYZ, A, W) + + + XYZ = np.array(XYZ) + A = np.array(A) + W = np.array(W) + L = np.array(L) + G = np.array(G) + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + + output_file = os.path.join(tempdir, "pred_struct.cif") + structures[0].to(output_file) + + return output_file + + +def run_op_gpu( + spacegroup, elements, wyckoff, + temperature, seed, T1, nsweeps, + access_key, project_id, machine_type, + tempdir +): + from bohrium_open_sdk import OpenSDK + import time + + client = OpenSDK(access_key=access_key) + + if not os.path.exists(tempdir): + os.makedirs(tempdir) + cmd = ( + f"python -c \"" + f"import os; " + f"import crystalformerapp; " + f"from crystalformerapp import op; " + f"op.run_op({spacegroup}, '{elements}', '{wyckoff}', " + f"{temperature}, {seed}, {T1}, {nsweeps}, f'./')" + f"\"" + ) + + # Convert project_id to native Python int + project_id_native = int(np.uint64(project_id)) + + resp = client.job.submit( + project_id=project_id_native, + machine_type=machine_type, + job_name="crystalformer", + cmd=cmd, + image_address="registry.dp.tech/dptech/prod-19853/crystal-former:0.0.1", + out_files=["*cif"], + dataset_path=[], + job_group_id=0, + ) + print(resp) + print("Job submitted. Waiting for completion...") + + # Loop to check the job status + job_id = resp["data"]['jobId'] + while True: + job_info = client.job.detail(job_id) + job_status = job_info["data"]["status"] + if job_status == 2: + print("Job completed!") + client.job.download(job_id, f'{tempdir}/out.zip') + os.system(f"unzip {tempdir}/out.zip -d {tempdir}") + return os.path.join(tempdir, "pred_struct.cif") + break + + elif job_status == -1: + print("Job failed.") + break + else: + print("Job not done yet. Checking again after 30 seconds...") + time.sleep(30) # Pause for 30 seconds before checking the status again + + diff --git a/crystalformerapp/op_gpu.py b/crystalformerapp/op_gpu.py new file mode 100644 index 0000000..9458c44 --- /dev/null +++ b/crystalformerapp/op_gpu.py @@ -0,0 +1,5 @@ +from op import run_op +from bohrium_open_sdk import OpenSDK + +input_params +run_op() \ No newline at end of file diff --git a/scripts/README.md b/crystalformerapp/scripts/README.md similarity index 100% rename from scripts/README.md rename to crystalformerapp/scripts/README.md diff --git a/crystalformerapp/scripts/__init__.py b/crystalformerapp/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/crystalformerapp/scripts/awl2struct.py b/crystalformerapp/scripts/awl2struct.py new file mode 100644 index 0000000..5d57649 --- /dev/null +++ b/crystalformerapp/scripts/awl2struct.py @@ -0,0 +1,121 @@ +import sys + +import pandas as pd +import numpy as np +from ast import literal_eval +import multiprocessing +import itertools +import argparse + +from crystalformerapp import src +from pymatgen.core import Structure, Lattice +from src.wyckoff import wmax_table, mult_table, symops + +symops = np.array(symops) +mult_table = np.array(mult_table) +wmax_table = np.array(wmax_table) + + +def symmetrize_atoms(g, w, x): + ''' + symmetrize atoms via, apply all sg symmetry op, finding the generator, and lastly apply symops + we need to do that because the sampled atom might not be at the first WP + Args: + g: int + w: int + x: (3,) + Returns: + xs: (m, 3) symmetrize atom positions + ''' + + # (1) apply all space group symmetry op to the x + w_max = wmax_table[g-1].item() + m_max = mult_table[g-1, w_max].item() + ops = symops[g-1, w_max, :m_max] # (m_max, 3, 4) + affine_point = np.array([*x, 1]) # (4, ) + coords = ops@affine_point # (m_max, 3) + coords -= np.floor(coords) + + # (2) search for the generator which satisfies op0(x) = x , i.e. the first Wyckoff position + # here we solve it in a jit friendly way by looking for the minimal distance solution for the lhs and rhs + #https://github.com/qzhu2017/PyXtal/blob/82e7d0eac1965c2713179eeda26a60cace06afc8/pyxtal/wyckoff_site.py#L115 + def dist_to_op0x(coord): + diff = np.dot(symops[g-1, w, 0], np.array([*coord, 1])) - coord + diff -= np.rint(diff) + return np.sum(diff**2) + # loc = np.argmin(jax.vmap(dist_to_op0x)(coords)) + loc = np.argmin([dist_to_op0x(coord) for coord in coords]) + x = coords[loc].reshape(3,) + + # (3) lastly, apply the given symmetry op to x + m = mult_table[g-1, w] + ops = symops[g-1, w, :m] # (m, 3, 4) + affine_point = np.array([*x, 1]) # (4, ) + xs = ops@affine_point # (m, 3) + xs -= np.floor(xs) # wrap back to 0-1 + return xs + +def get_struct_from_lawx(G, L, A, W, X): + """ + Get the pymatgen.Structure object from the input data + + Args: + G: space group number + L: lattice parameters + A: element number list + W: wyckoff letter list + X: fractional coordinates list + + Returns: + struct: pymatgen.Structure object + """ + A = A[np.nonzero(A)] + X = X[np.nonzero(A)] + W = W[np.nonzero(A)] + + lattice = Lattice.from_parameters(*L) + xs_list = [symmetrize_atoms(G, w, x) for w, x in zip(W, X)] + as_list = [[A[idx] for _ in range(len(xs))] for idx, xs in enumerate(xs_list)] + A_list = list(itertools.chain.from_iterable(as_list)) + X_list = list(itertools.chain.from_iterable(xs_list)) + struct = Structure(lattice, A_list, X_list) + return struct.as_dict() + +def main(args): + input_path = args.output_path + f'output_{args.label}.csv' + origin_data = pd.read_csv(input_path) + L,X,A,W = origin_data['L'],origin_data['X'],origin_data['A'],origin_data['W'] + L = L.apply(lambda x: literal_eval(x)) + X = X.apply(lambda x: literal_eval(x)) + A = A.apply(lambda x: literal_eval(x)) + W = W.apply(lambda x: literal_eval(x)) + # M = M.apply(lambda x: literal_eval(x)) + + # convert array of list to numpy ndarray + L = np.array(L.tolist()) + X = np.array(X.tolist()) + A = np.array(A.tolist()) + W = np.array(W.tolist()) + print(L.shape,X.shape,A.shape,W.shape) + + ### Multiprocessing. Use it if only run on CPU + p = multiprocessing.Pool(args.num_io_process) + G = np.array([int(args.label) for _ in range(len(L))]) + structures = p.starmap_async(get_struct_from_lawx, zip(G, L, A, W, X)).get() + p.close() + p.join() + + output_path = args.output_path + f'output_{args.label}_struct.csv' + + data = pd.DataFrame() + data['cif'] = structures + data.to_csv(output_path, mode='a', index=False, header=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='') + parser.add_argument('--output_path', default='./', help='filepath of the output and input file') + parser.add_argument('--label', default='194', help='output file label') + parser.add_argument('--num_io_process', type=int, default=40, help='number of process used in multiprocessing io') + args = parser.parse_args() + main(args) diff --git a/crystalformerapp/scripts/compute_metrics.py b/crystalformerapp/scripts/compute_metrics.py new file mode 100644 index 0000000..4f06855 --- /dev/null +++ b/crystalformerapp/scripts/compute_metrics.py @@ -0,0 +1,149 @@ +# Taken from: https://github.com/txie-93/cdvae/blob/main/scripts/compute_metrics.py +from collections import Counter +import argparse +import json +import os +import pandas as pd +from ast import literal_eval + +import numpy as np +import multiprocessing +from pathlib import Path + +from pymatgen.core.structure import Structure, Composition +from matminer.featurizers.site.fingerprint import CrystalNNFingerprint +from matminer.featurizers.composition.composite import ElementProperty + +from eval_utils import ( + smact_validity, structure_validity) + +# TODO: AttributeError in CrystalNNFP +CrystalNNFP = CrystalNNFingerprint.from_preset("ops") +CompFP = ElementProperty.from_preset('magpie') + + +class Crystal(object): + + def __init__(self, crys_dict): + self.crys_dict = crys_dict + + self.get_structure() + self.get_composition() + self.get_validity() + # self.get_fingerprints() + + def get_structure(self): + try: + self.structure = Structure.from_dict(self.crys_dict) + self.atom_types = [s.specie.number for s in self.structure] + self.constructed = True + except Exception: + self.constructed = False + self.invalid_reason = 'construction_raises_exception' + if self.structure.volume < 0.1: + self.constructed = False + self.invalid_reason = 'unrealistically_small_lattice' + + def get_composition(self): + elem_counter = Counter(self.atom_types) + composition = [(elem, elem_counter[elem]) + for elem in sorted(elem_counter.keys())] + elems, counts = list(zip(*composition)) + counts = np.array(counts) + counts = counts / np.gcd.reduce(counts) + self.elems = elems + self.comps = tuple(counts.astype('int').tolist()) + + def get_validity(self): + self.comp_valid = smact_validity(self.elems, self.comps) + if self.constructed: + self.struct_valid = structure_validity(self.structure) + else: + self.struct_valid = False + self.valid = self.comp_valid and self.struct_valid + + def get_fingerprints(self): + elem_counter = Counter(self.atom_types) + comp = Composition(elem_counter) + self.comp_fp = CompFP.featurize(comp) + try: + site_fps = [CrystalNNFP.featurize( + self.structure, i) for i in range(len(self.structure))] + except Exception: + # counts crystal as invalid if fingerprint cannot be constructed. + self.valid = False + self.comp_fp = None + self.struct_fp = None + return + self.struct_fp = np.array(site_fps).mean(axis=0) + + +def get_validity(crys): + comp_valid = np.array([c.comp_valid for c in crys]).mean() + struct_valid = np.array([c.struct_valid for c in crys]).mean() + valid = np.array([c.valid for c in crys]).mean() + return {'comp_valid': comp_valid, + 'struct_valid': struct_valid, + 'valid': valid} + +def get_crystal(cif_dict): + try: return Crystal(cif_dict) + except: + print("Crystal construction failed") + # print(cif_dict) + struct = Structure.from_dict(cif_dict) + print(struct) + return None # return None if Crystal construction fails + +def main(args): + all_metrics = {} + + csv_path = os.path.join(args.root_path, args.filename) + data = pd.read_csv(csv_path) + cif_strings = data['cif'] + + p = multiprocessing.Pool(args.num_io_process) + crys_dict = p.map_async(literal_eval, cif_strings).get() + # crys = p.map_async(Crystal, crys_dict).get() + crys = p.map_async(get_crystal, crys_dict).get() + crys = [c for c in crys if c is not None] + print(f"Number of valid crystals: {len(crys)}") + p.close() + p.join() + + all_metrics['validity'] = get_validity(crys) + print(all_metrics) + + if args.label == '': + metrics_out_file = 'eval_metrics.json' + else: + metrics_out_file = f'eval_metrics_{args.label}.json' + metrics_out_file = os.path.join(args.root_path, metrics_out_file) + print("output path:", metrics_out_file) + + # only overwrite metrics computed in the new run. + if Path(metrics_out_file).exists(): + with open(metrics_out_file, 'r') as f: + written_metrics = json.load(f) + if isinstance(written_metrics, dict): + written_metrics.update(all_metrics) + else: + with open(metrics_out_file, 'w') as f: + json.dump(all_metrics, f) + if isinstance(written_metrics, dict): + with open(metrics_out_file, 'w') as f: + json.dump(written_metrics, f) + else: + with open(metrics_out_file, 'w') as f: + json.dump(all_metrics, f) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--root_path', default='/data/zdcao/crystal_gpt/dataset/mp_20/symm_data/') + parser.add_argument('--filename', default='out_structure.csv') + parser.add_argument('--label', default='') + parser.add_argument('--num_io_process', type=int, default=40, help='number of process used in multiprocessing io') + args = parser.parse_args() + main(args) + diff --git a/crystalformerapp/scripts/compute_metrics_matbench.py b/crystalformerapp/scripts/compute_metrics_matbench.py new file mode 100644 index 0000000..4a97164 --- /dev/null +++ b/crystalformerapp/scripts/compute_metrics_matbench.py @@ -0,0 +1,60 @@ +# Function: compute the metrics of the generated structures +# It takes about 20 min to compute the metrics of 9000 generated structures for MP-20 dataset +import pandas as pd +from pymatgen.core import Structure +import multiprocessing +import argparse +from ast import literal_eval +import json +from time import time + +from matbench_genmetrics.core.metrics import GenMetrics + + +def get_structure(cif): + try: + return Structure.from_str(cif, fmt='cif') + except: + return Structure.from_dict(literal_eval(cif)) + +def main(args): + train_df = pd.read_csv(args.train_path) + test_df = pd.read_csv(args.test_path) + gen_df = pd.read_csv(args.gen_path) + + p = multiprocessing.Pool(args.num_io_process) + train_structures = p.map_async(get_structure, train_df['cif']).get() + test_structures = p.map_async(get_structure, test_df['cif']).get() + gen_structures = p.map_async(get_structure, gen_df['cif']).get() + p.close() + p.join() + + start_time = time() + all_metrics = {} + gen_metrics = GenMetrics(train_structures=train_structures, + test_structures=test_structures, + gen_structures=gen_structures, + ) + + # all_metrics = gen_metrics.metrics + # all_metrics['validity'] = gen_metrics.validity + all_metrics['novelty'] = gen_metrics.novelty + all_metrics['uniqueness'] = gen_metrics.uniqueness + + end_time = time() + print('Time used: {:.2f} s'.format(end_time - start_time)) + print(all_metrics) + with open(args.output_path + f'metrics_{args.label}.json', 'w') as f: + json.dump(all_metrics, f, indent=4) + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='') + parser.add_argument('--train_path', default='/data/zdcao/crystal_gpt/dataset/mp_20/sg_225/train_sg_225.csv', help='') + parser.add_argument('--test_path', default='/data/zdcao/crystal_gpt/dataset/mp_20/sg_225/test_sg_225.csv', help='') + parser.add_argument('--gen_path', default='/data/zdcao/crystal_gpt/data/adam_bs_100_lr_0.0001_decay_0_clip_1_A_119_W_28_N_21_Nf_5_K_48_16_h0_256_l_4_H_8_k_16_m_32_drop_0.3/temp_1.0/output_225.csv', help='') + parser.add_argument('--output_path', default='//data/zdcao/crystal_gpt/data/adam_bs_100_lr_0.0001_decay_0_clip_1_A_119_W_28_N_21_Nf_5_K_48_16_h0_256_l_4_H_8_k_16_m_32_drop_0.3/temp_1.0/', help='filepath of the metrics output file') + parser.add_argument('--label', default='225', help='output file label') + parser.add_argument('--num_io_process', type=int, default=40, help='number of process used in multiprocessing io') + args = parser.parse_args() + + main(args) diff --git a/crystalformerapp/scripts/config.py b/crystalformerapp/scripts/config.py new file mode 100644 index 0000000..7f612ac --- /dev/null +++ b/crystalformerapp/scripts/config.py @@ -0,0 +1,3 @@ +import os, sys +testdir = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(os.path.join(testdir, "../src")) diff --git a/crystalformerapp/scripts/e_above_hull.py b/crystalformerapp/scripts/e_above_hull.py new file mode 100644 index 0000000..bc742cb --- /dev/null +++ b/crystalformerapp/scripts/e_above_hull.py @@ -0,0 +1,120 @@ +import os +import pandas as pd +import numpy as np +import tempfile +from mp_api.client import MPRester +from pymatgen.core import Structure +from pymatgen.analysis.phase_diagram import PhaseDiagram +from pymatgen.entries.computed_entries import ComputedStructureEntry +from pymatgen.entries.compatibility import MaterialsProject2020Compatibility +from pymatgen.io.vasp.sets import MPRelaxSet +from pymatgen.io.vasp.inputs import Incar, Poscar + + +# Taken from https://github.com/facebookresearch/crystal-llm/blob/main/e_above_hull.py +def generate_CSE(structure, m3gnet_energy): + # Write VASP inputs files as if we were going to do a standard MP run + # this is mainly necessary to get the right U values / etc + b = MPRelaxSet(structure) + with tempfile.TemporaryDirectory() as tmpdirname: + b.write_input(f"{tmpdirname}/", potcar_spec=True) + poscar = Poscar.from_file(f"{tmpdirname}/POSCAR") + incar = Incar.from_file(f"{tmpdirname}/INCAR") + clean_structure = Structure.from_file(f"{tmpdirname}/POSCAR") + + # Get the U values and figure out if we should have run a GGA+U calc + param = {"hubbards": {}} + if "LDAUU" in incar: + param["hubbards"] = dict(zip(poscar.site_symbols, incar["LDAUU"])) + param["is_hubbard"] = ( + incar.get("LDAU", True) and sum(param["hubbards"].values()) > 0 + ) + if param["is_hubbard"]: + param["run_type"] = "GGA+U" + + # Make a ComputedStructureEntry without the correction + cse_d = { + "structure": clean_structure, + "energy": m3gnet_energy, + "correction": 0.0, + "parameters": param, + } + + # Apply the MP 2020 correction scheme (anion/+U/etc) + cse = ComputedStructureEntry.from_dict(cse_d) + _ = MaterialsProject2020Compatibility(check_potcar=False).process_entries( + cse, + clean=True, + ) + + # Return the final CSE (notice that the composition/etc is also clean, not things like Fe3+)! + return cse + + +def get_strutures_ehull(mpr, structures, energies): + """ + Get the e_above_hull for a list of structures + + Args: + mpr: MPRester object + structures: list of pymatgen.Structure objects + energies: list of energies of the structures + + Returns: + ehull_list: list of e_above_hull values + """ + ehull_list = [] + for s, e in zip(structures, energies): + # entry = PDEntry(s.composition, e) + entry = generate_CSE(s, e) + elements = [el.name for el in entry.composition.elements] + + # Obtain only corrected GGA and GGA+U ComputedStructureEntry objects + entries = mpr.get_entries_in_chemsys(elements=elements, + additional_criteria={"thermo_types": ["GGA_GGA+U"], + "is_stable": True} # Only stable entries + ) + pd = PhaseDiagram(entries) + try: + ehull = pd.get_e_above_hull(entry, allow_negative=True) + ehull_list.append(ehull) + print(f"Structure: {s.formula}, E_hull: {ehull:.3f} eV/atom") + except: + print(f"Structure: {s.formula}, E_hull: N/A") + ehull_list.append(np.nan) + + return ehull_list + + +def main(args): + data = pd.read_csv(os.path.join(args.restore_path, args.filename)) + cif_strings = data["relaxed_cif"] + structures = [Structure.from_str(cif, fmt="cif") for cif in cif_strings] + mpr = MPRester(args.api_key) + + unrelaxed_ehull_list = get_strutures_ehull(mpr, structures, data["initial_energy"]) + if args.relaxation: + relaxed_ehull_list = get_strutures_ehull(mpr, structures, data["final_energy"]) + else: + relaxed_ehull_list = [np.nan] * len(structures) # Fill with NaNs + + output_data = pd.DataFrame() + output_data["relaxed_cif"] = cif_strings + output_data["relaxed_ehull"] = relaxed_ehull_list + output_data["unrelaxed_ehull"] = unrelaxed_ehull_list + if args.label: + output_data.to_csv(f"ehull_{args.label}.csv", index=False) + else: + output_data.to_csv("ehull.csv", index=False) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--restore_path", type=str, default="/data/zdcao/crystal_gpt/dataset/mp_20/") + parser.add_argument('--filename', default='relaxed_structures_testdata.csv') + parser.add_argument('--relaxation', action='store_true') + parser.add_argument('--api_key', default='9zBRHS6Zp94KE28PeMdSk5gCyteIm6Ks') + parser.add_argument('--label', default='testdata') + args = parser.parse_args() + main(args) diff --git a/crystalformerapp/scripts/eval_utils.py b/crystalformerapp/scripts/eval_utils.py new file mode 100644 index 0000000..09a0471 --- /dev/null +++ b/crystalformerapp/scripts/eval_utils.py @@ -0,0 +1,65 @@ +import itertools +import numpy as np + +import smact +from smact.screening import pauling_test + +from config import * +from elements import element_list + +# Taken without modification from the original CDVAE repo (https://github.com/txie-93/cdvae) +# But delete the unused functions + +def smact_validity(comp, count, + use_pauling_test=True, + include_alloys=True): + elem_symbols = tuple([element_list[elem] for elem in comp]) + space = smact.element_dictionary(elem_symbols) + smact_elems = [e[1] for e in space.items()] + electronegs = [e.pauling_eneg for e in smact_elems] + ox_combos = [e.oxidation_states for e in smact_elems] + if len(set(elem_symbols)) == 1: + return True + if include_alloys: + is_metal_list = [elem_s in smact.metals for elem_s in elem_symbols] + if all(is_metal_list): + return True + + threshold = np.max(count) + compositions = [] + for ox_states in itertools.product(*ox_combos): + stoichs = [(c,) for c in count] + # Test for charge balance + cn_e, cn_r = smact.neutral_ratios( + ox_states, stoichs=stoichs, threshold=threshold) + # Electronegativity test + if cn_e: + if use_pauling_test: + try: + electroneg_OK = pauling_test(ox_states, electronegs) + except TypeError: + # if no electronegativity data, assume it is okay + electroneg_OK = True + else: + electroneg_OK = True + if electroneg_OK: + for ratio in cn_r: + compositions.append( + tuple([elem_symbols, ox_states, ratio])) + compositions = [(i[0], i[2]) for i in compositions] + compositions = list(set(compositions)) + if len(compositions) > 0: + return True + else: + return False + + +def structure_validity(crystal, cutoff=0.5): + dist_mat = crystal.distance_matrix + # Pad diagonal with a large number + dist_mat = dist_mat + np.diag( + np.ones(dist_mat.shape[0]) * (cutoff + 10.)) + if dist_mat.min() < cutoff or crystal.volume < 0.1: + return False + else: + return True \ No newline at end of file diff --git a/crystalformerapp/scripts/matgl_relax.py b/crystalformerapp/scripts/matgl_relax.py new file mode 100644 index 0000000..7c6b4e6 --- /dev/null +++ b/crystalformerapp/scripts/matgl_relax.py @@ -0,0 +1,95 @@ +import matgl +from matgl.ext.ase import PESCalculator, Relaxer + +from pymatgen.core import Structure +from pymatgen.io.ase import AseAtomsAdaptor + +import torch +torch.set_default_device("cuda") + +import warnings +# To suppress warnings for clearer output +warnings.simplefilter("ignore") + +import pandas as pd +import os +from time import time +from ast import literal_eval + + +def relax_structures(pot, structures, relaxations): + """ + Relax structures using M3GNet potential + + Args: + pot: M3GNet potential + structures: list of pymatgen.Structure objects + relaxations: boolean, whether to perform relaxation + + Returns: + initial_energies: list of initial energies of the structures + final_energies: list of final energies of the structures + relaxed_cif_strings: list of relaxed structures in cif format + """ + if relaxations: + print("Relaxing structures with M3GNet...") + relaxer = Relaxer(potential=pot) + relax_results_list = [relaxer.relax(struct, fmax=0.01) for struct in structures] + initial_energies = [relax_results["trajectory"].energies[0] for relax_results in relax_results_list] + final_energies = [relax_results["trajectory"].energies[-1] for relax_results in relax_results_list] + relaxed_cif_strings = [relax_results["final_structure"].to(fmt="cif") for relax_results in relax_results_list] + else: + print("No relaxation was performed. Returning initial energies as final energies.") + ase_adaptor = AseAtomsAdaptor() + initial_energies = [] + for struct in structures: + # Create ase atom object + atoms = ase_adaptor.get_atoms(struct) + # define the M3GNet calculator + calc = PESCalculator(pot) + # set up the calculator for atoms object + atoms.set_calculator(calc) + initial_energies.append(atoms.get_potential_energy()) + final_energies = initial_energies # if no relaxation, final energy is the same as initial energy + relaxed_cif_strings = [struct.to(fmt="cif") for struct in structures] + + return initial_energies, final_energies, relaxed_cif_strings + + +def main(args): + csv_file = os.path.join(args.restore_path, args.filename) + + data = pd.read_csv(csv_file) + cif_strings = data['cif'] + + try: structures = [Structure.from_dict(literal_eval(cif)) for cif in cif_strings] + except: structures = [Structure.from_str(cif, fmt="cif") for cif in cif_strings] + pot = matgl.load_model(args.model_path) + print("Relaxing structures...") + start_time = time() + initial_energies, final_energies, relaxed_cif_strings = relax_structures(pot, structures, args.relaxation) + end_time = time() + print(f"Relaxation took {end_time - start_time:.2f} seconds") + + output_data = pd.DataFrame() + output_data['initial_energy'] = initial_energies + output_data['final_energy'] = final_energies + output_data['relaxed_cif'] = relaxed_cif_strings + if args.label: + output_data.to_csv(os.path.join(args.restore_path, f"relaxed_structures_{args.label}.csv"), + index=False) + else: + output_data.to_csv(os.path.join(args.restore_path, "relaxed_structures.csv"), + index=False) + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--restore_path", type=str, default="/data/zdcao/crystal_gpt/data/b38199e3/adam_bs_100_lr_0.0001_decay_0_clip_1_A_119_W_28_N_21_a_1_w_1_l_1_Nf_5_Kx_16_Kl_4_h0_256_l_16_H_16_k_64_m_64_e_32_drop_0.5/unconditional/sorted") + parser.add_argument('--filename', default='output_225_struct.csv') + parser.add_argument('--relaxation', action='store_true') + parser.add_argument('--model_path', default='/data/zdcao/website/matgl/pretrained_models/M3GNet-MP-2021.2.8-PES') + parser.add_argument('--label', default='') + args = parser.parse_args() + main(args) diff --git a/crystalformerapp/scripts/plot_embedding.py b/crystalformerapp/scripts/plot_embedding.py new file mode 100644 index 0000000..1c09059 --- /dev/null +++ b/crystalformerapp/scripts/plot_embedding.py @@ -0,0 +1,56 @@ +import jax +import jax.numpy as jnp +import numpy as np +import matplotlib.pyplot as plt +import os +from functools import partial + +import sys +sys.path.append("../src/") +import checkpoint +from elements import element_list + +@partial(jax.vmap, in_axes=(0, None), out_axes=0) +@partial(jax.vmap, in_axes=(None, 0), out_axes=0) +def cosine_similarity(vector1, vector2): + dot_product = jnp.dot(vector1, vector2) + norm_a = jnp.linalg.norm(vector1) + norm_b = jnp.linalg.norm(vector2) + return dot_product / (norm_a * norm_b) + +import argparse +parser = argparse.ArgumentParser(description="pretrain rdf") +parser.add_argument("--restore_path", default="/data/wanglei/crystalgpt/mp-mpsort-xyz-embed/w-a-x-y-z-periodic-fixed-size-embed-eb630/adam_bs_100_lr_0.0001_decay_0_clip_1_A_119_W_28_N_21_a_1_w_1_l_1_Nf_5_Kx_16_Kl_4_h0_256_l_8_H_8_k_32_m_64_e_32_drop_0.3/", help="") +args = parser.parse_args() + +path = os.path.dirname(args.restore_path) + + +ckpt_filename, epoch_finished = checkpoint.find_ckpt_filename(args.restore_path) +print("Load checkpoint file: %s, epoch finished: %g" %(ckpt_filename, epoch_finished)) +ckpt = checkpoint.load_data(ckpt_filename) + +a_embeddings = ckpt["params"]["~"]["a_embeddings"] +a_a = cosine_similarity(a_embeddings, a_embeddings) + +g_embeddings = ckpt["params"]["~"]["g_embeddings"] +g_g = cosine_similarity(g_embeddings, g_embeddings) + +print (a_a.shape, g_g.shape) + +fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(16, 8)) + +ax = axes[0] +a_max = 90 +ticks = np.arange(a_max) +element_ticks = [element_list[i+1] for i in ticks] +ax.set_xticks(ticks, labels=element_ticks, fontsize=8, rotation=90) +ax.set_yticks(ticks, labels=element_ticks, fontsize=8) +cax = ax.imshow(a_a[1:a_max+1, 1:a_max+1], cmap='coolwarm', interpolation='none') +fig.colorbar(cax, ax=ax) + +ax = axes[1] +cax = ax.imshow(g_g[:100, :100], cmap='coolwarm', interpolation='none') +fig.colorbar(cax, ax=ax) + +plt.show() diff --git a/scripts/structure_visualization.ipynb b/crystalformerapp/scripts/structure_visualization.ipynb similarity index 100% rename from scripts/structure_visualization.ipynb rename to crystalformerapp/scripts/structure_visualization.ipynb diff --git a/crystalformerapp/simple_op.py b/crystalformerapp/simple_op.py new file mode 100644 index 0000000..84c1ad7 --- /dev/null +++ b/crystalformerapp/simple_op.py @@ -0,0 +1,116 @@ +import sys +import os +import jax +import jax.numpy as jnp +from hydra import initialize, compose +import numpy as np +from pymatgen.core import Structure +from time import time +from pymatgen.io.ase import AseAtomsAdaptor +from ase.io import write + +from jax.lib import xla_bridge +# Check if GPU is available +try: + if xla_bridge.get_backend().platform == 'gpu': + print("GPU is available. Using GPU.") + else: + raise RuntimeError("No GPU available, switching to CPU.") +except RuntimeError as e: + print(e) + os.environ["JAX_PLATFORMS"] = "cpu" + jax.config.update("jax_platform_name", "cpu") + print("Changed platform to CPU.") + +from crystalformerapp import src, scripts +from src.elements import element_dict +from scripts.awl2struct import get_struct_from_lawx +from src.checkpoint import find_ckpt_filename +from src.transformer import make_transformer +from src.simple_sample import sample_crystal + +import io +import tempfile +import shutil + +sys.path.append(os.path.dirname(os.path.abspath(__file__))) +def configure_jax(): + jax.config.update("jax_enable_x64", True) + +def initialize_parameters(args, seed=42): + key = jax.random.PRNGKey(seed) + params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + 4, 8, + 32, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + 0.3) + return params, transformer + +def load_checkpoint(restore_path): + print("\n========== Load checkpoint==========") + ckpt_filename, epoch_finished = (restore_path) + if ckpt_filename is not None: + print(f"Load checkpoint file: {ckpt_filename}, epoch finished: {epoch_finished}") + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] + else: + print("No checkpoint file found. Start from scratch.") + params = None + return params + +def generate_crystal(spacegroup, elements, temperature, seed, params, transformer, args): + print(f"Generating with spacegroup={spacegroup}, elements={elements}, temperature={temperature}") + top_p = 1 + n_sample = 1 + elements = elements.split() + if elements: + idx = [element_dict[e] for e in elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) + + key = jax.random.PRNGKey(seed) + key, subkey = jax.random.split(key) + start_time = time() + XYZ, A, W, M, L = sample_crystal( + subkey, + transformer, + params, + args.n_max, + n_sample, + args.atom_types, + args.wyck_types, + args.Kx, args.Kl, + spacegroup, None, + atom_mask, top_p, + temperature, + temperature, + args.use_foriloop) + + end_time = time() + print(f"Execution time: {end_time - start_time}") + + XYZ, A, W, L = map(np.array, (XYZ, A, W, L)) + G = np.array([spacegroup for _ in range(len(L))]) + + structures = [get_struct_from_lawx(g, l, a, w, xyz) for g, l, a, w, xyz in zip(G, L, A, W, XYZ)] + structures = [Structure.from_dict(_) for _ in structures] + atoms_list = [AseAtomsAdaptor().get_atoms(struct) for struct in structures] + + return atoms_list + +def run_crystalformer(spacegroup, elements, temperature, seed, tempdir): + configure_jax() + with initialize(version_base=None, config_path="./model"): + args = compose(config_name="config") + params, transformer = initialize_parameters(args) + restore_path = "/share/" + + params = load_checkpoint(restore_path) if params is None else params + atoms_list = generate_crystal(spacegroup, elements, temperature, seed, params, transformer, args) + outputPath = os.path.join(tempdir, "pred_struct.cif") + write(outputPath, atoms_list[-1], format="cif") + + return outputPath \ No newline at end of file diff --git a/crystalformerapp/src/__init__.py b/crystalformerapp/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/crystalformerapp/src/attention.py b/crystalformerapp/src/attention.py new file mode 100644 index 0000000..866409c --- /dev/null +++ b/crystalformerapp/src/attention.py @@ -0,0 +1,156 @@ +# https://github.com/google-deepmind/dm-haiku/blob/main/haiku/_src/attention.py +# Copyright 2020 DeepMind Technologies Limited. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""(Multi-Head) Attention module for use in Transformer architectures.""" + +from typing import Optional +import warnings + +import jax +import jax.numpy as jnp +import numpy as np + +import haiku as hk + + +class MultiHeadAttention(hk.Module): + """Multi-headed attention (MHA) module. + + This module is intended for attending over sequences of vectors. + + Rough sketch: + - Compute keys (K), queries (Q), and values (V) as projections of inputs. + - Attention weights are computed as W = softmax(QK^T / sqrt(key_size)). + - Output is another projection of WV^T. + + For more detail, see the original Transformer paper: + "Attention is all you need" https://arxiv.org/abs/1706.03762. + + Glossary of shapes: + - T: Sequence length. + - D: Vector (embedding) size. + - H: Number of attention heads. + """ + + def __init__( + self, + num_heads: int, + key_size: int, + w_init: Optional[hk.initializers.Initializer] = None, + with_bias: bool = True, + b_init: Optional[hk.initializers.Initializer] = None, + value_size: Optional[int] = None, + model_size: Optional[int] = None, + dropout_rate: Optional[float] = 0.0, + name: Optional[str] = None, + ): + """Initialises the module. + + Args: + num_heads: Number of independent attention heads (H). + key_size: The size of keys (K) and queries used for attention. + w_init: Initialiser for weights in the linear map. Once `w_init_scale` is + fully deprecated `w_init` will become mandatory. Until then it has a + default value of `None` for backwards compatability. + with_bias: Whether to add a bias when computing various linear + projections. + b_init: Optional initializer for bias. By default, zero. + value_size: Optional size of the value projection (V). If None, defaults + to the key size (K). + model_size: Optional size of the output embedding (D'). If None, defaults + to the key size multiplied by the number of heads (K * H). + name: Optional name for this module. + """ + super().__init__(name=name) + self.num_heads = num_heads + self.key_size = key_size + self.value_size = value_size or key_size + self.model_size = model_size or key_size * num_heads + self.dropout_rate = dropout_rate + + if w_init is None: + w_init = hk.initializers.VarianceScaling(w_init_scale) + self.w_init = w_init + self.with_bias = with_bias + self.b_init = b_init + + def __call__( + self, + query: jax.Array, + key: jax.Array, + value: jax.Array, + mask: Optional[jax.Array] = None, + is_train : Optional[bool] = False, + ) -> jax.Array: + """Computes (optionally masked) MHA with queries, keys & values. + + This module broadcasts over zero or more 'batch-like' leading dimensions. + + Args: + query: Embeddings sequence used to compute queries; shape [..., T', D_q]. + key: Embeddings sequence used to compute keys; shape [..., T, D_k]. + value: Embeddings sequence used to compute values; shape [..., T, D_v]. + mask: Optional mask applied to attention weights; shape [..., H=1, T', T]. + + Returns: + A new sequence of embeddings, consisting of a projection of the + attention-weighted value projections; shape [..., T', D']. + """ + + # In shape hints below, we suppress the leading dims [...] for brevity. + # Hence e.g. [A, B] should be read in every case as [..., A, B]. + *leading_dims, sequence_length, _ = query.shape + projection = self._linear_projection + + # Compute key/query/values (overload K/Q/V to denote the respective sizes). + query_heads = projection(query, self.key_size, "query") # [T', H, Q=K] + key_heads = projection(key, self.key_size, "key") # [T, H, K] + value_heads = projection(value, self.value_size, "value") # [T, H, V] + + # Compute attention weights. + attn_logits = jnp.einsum("...thd,...Thd->...htT", query_heads, key_heads) + attn_logits = attn_logits / np.sqrt(self.key_size).astype(key.dtype) + if mask is not None: + if mask.ndim != attn_logits.ndim: + raise ValueError( + f"Mask dimensionality {mask.ndim} must match logits dimensionality " + f"{attn_logits.ndim}." + ) + attn_logits = jnp.where(mask, attn_logits, -1e30) + attn_weights = jax.nn.softmax(attn_logits) # [H, T', T] + + if is_train: + attn_weights = hk.dropout(hk.next_rng_key(), self.dropout_rate, attn_weights) + + # Weight the values by the attention and flatten the head vectors. + attn = jnp.einsum("...htT,...Thd->...thd", attn_weights, value_heads) + attn = jnp.reshape(attn, (*leading_dims, sequence_length, -1)) # [T', H*V] + + # Apply another projection to get the final embeddings. + final_projection = hk.Linear(self.model_size, w_init=self.w_init, + with_bias=self.with_bias, b_init=self.b_init) + return final_projection(attn) # [T', D'] + + @hk.transparent + def _linear_projection( + self, + x: jax.Array, + head_size: int, + name: Optional[str] = None, + ) -> jax.Array: + y = hk.Linear(self.num_heads * head_size, w_init=self.w_init, + with_bias=self.with_bias, b_init=self.b_init, name=name)(x) + *leading_dims, _ = x.shape + return y.reshape((*leading_dims, self.num_heads, head_size)) diff --git a/crystalformerapp/src/checkpoint.py b/crystalformerapp/src/checkpoint.py new file mode 100644 index 0000000..2f86216 --- /dev/null +++ b/crystalformerapp/src/checkpoint.py @@ -0,0 +1,43 @@ +import pickle +import os +import re + +def find_ckpt_filename(path_or_file): + """ + Find the latest checkpoint file in the given directory or the given file. + If path_or_file is a file, it should be a checkpoint file. + If path_or_file is a directory, it should contain checkpoint files. + Returns the filename of the latest checkpoint file and the epoch number. + + Args: + path_or_file (str): The directory containing checkpoint files or a checkpoint file. + + Returns: + fname: The filename of the latest checkpoint file. + epoch: The epoch number of the latest checkpoint file. + """ + if os.path.isfile(path_or_file): + epoch = int(re.search('epoch_([0-9]*).pkl', path_or_file).group(1)) + return path_or_file, epoch + files = [f for f in os.listdir(path_or_file) if ('pkl' in f)] + for f in sorted(files, reverse=True): + fname = os.path.join(path_or_file, f) + try: + with open(fname, "rb") as f: + pickle.load(f) + epoch = int(re.search('epoch_([0-9]*).pkl', fname).group(1)) + return fname, epoch + except (OSError, EOFError): + print('Error loading checkpoint. Trying next checkpoint...', fname) + return None, 0 + +def load_data(filename): + with open(filename, "rb") as f: + data = pickle.load(f) + return data + +def save_data(data, filename): + with open(filename, "wb") as f: + pickle.dump(data, f) + + diff --git a/crystalformerapp/src/elements.py b/crystalformerapp/src/elements.py new file mode 100644 index 0000000..8c99a44 --- /dev/null +++ b/crystalformerapp/src/elements.py @@ -0,0 +1,59 @@ +element_list = [ + # 0 + 'X', + # 1 + 'H', 'He', + # 2 + 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', + # 3 + 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar', + # 4 + 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', + 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', + # 5 + 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', + 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe', + # 6 + 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', + 'Ho', 'Er', 'Tm', 'Yb', 'Lu', + 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', + 'Po', 'At', 'Rn', + # 7 + 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', + 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr', + 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', + 'Lv', 'Ts', 'Og'] + +element_dict = {value: index for index, value in enumerate(element_list)} + +# radioactive elements +radioactive_elements = [ 'Tc', 'Pm', 'Bi', 'Po', 'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', + 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh', + 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og'] +radioactive_elements_dict = {e: element_dict[e] for e in radioactive_elements} + +# noble gas elements +noble_gas = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn', 'Og'] +noble_gas_dict = {e: element_dict[e] for e in noble_gas} + + +if __name__=="__main__": + print (len(element_list)) + print (element_dict["H"]) + + atom_types = 119 + wyck_types = 3 + aw_types = (atom_types -1)*(wyck_types -1) + 1 + print (aw_types) + idx = [element_dict[e] for e in ['H', 'C', 'O']] + aw_mask = [1] + [1 if ((i-1)%(atom_types-1)+1 in idx) else 0 for i in range(1, aw_types)] # 1 for possible elements + print (idx ) + print (aw_mask) + print(radioactive_elements_dict) + print(noble_gas_dict) + atom_mask = [1] + [1 if i not in radioactive_elements_dict.values() and i not in noble_gas_dict.values() else 0 for i in range(1, atom_types)] + print('sampling structure formed by non-radioactive elements and non-noble gas') + print(atom_mask) + + + diff --git a/crystalformerapp/src/lattice.py b/crystalformerapp/src/lattice.py new file mode 100644 index 0000000..9135942 --- /dev/null +++ b/crystalformerapp/src/lattice.py @@ -0,0 +1,51 @@ +import jax +import jax.numpy as jnp + +def make_lattice_mask(): + ''' + return mask for independent lattice params + ''' + # 1-2 + # 3-15 + # 16-74 + # 75-142 + # 143-194 + # 195-230 + mask = [1, 1, 1, 1, 1, 1] * 2 +\ + [1, 1, 1, 0, 1, 0] * 13+\ + [1, 1, 1, 0, 0, 0] * 59+\ + [1, 0, 1, 0, 0, 0] * 68+\ + [1, 0, 1, 0, 0, 0] * 52+\ + [1, 0, 0, 0, 0, 0] * 36 + + return jnp.array(mask).reshape(230, 6) + +def symmetrize_lattice(spacegroup, lattice): + ''' + place lattice params into lattice according to the space group + ''' + + a, b, c, alpha, beta, gamma = lattice + + L = lattice + L = jnp.where(spacegroup <= 2, L, jnp.array([a, b, c, 90., beta, 90.])) + L = jnp.where(spacegroup <= 15, L, jnp.array([a, b, c, 90., 90., 90.])) + L = jnp.where(spacegroup <= 74, L, jnp.array([a, a, c, 90., 90., 90.])) + L = jnp.where(spacegroup <= 142, L, jnp.array([a, a, c, 90., 90., 120.])) + L = jnp.where(spacegroup <= 194, L, jnp.array([a, a, a, 90., 90., 90.])) + + return L + +if __name__ == '__main__': + + mask = make_lattice_mask() + print (mask) + + key = jax.random.PRNGKey(42) + lattice = jax.random.normal(key, (6,)) + lattice = lattice.reshape([1, 6]).repeat(3, axis=0) + + G = jnp.array([25, 99, 221]) + L = jax.vmap(symmetrize_lattice)(G, lattice) + print (L) + diff --git a/crystalformerapp/src/loss.py b/crystalformerapp/src/loss.py new file mode 100644 index 0000000..a59c448 --- /dev/null +++ b/crystalformerapp/src/loss.py @@ -0,0 +1,121 @@ +import jax +#jax.config.update("jax_enable_x64", True) +import jax.numpy as jnp +from functools import partial + +from .von_mises import von_mises_logpdf +from .lattice import make_lattice_mask +from .wyckoff import mult_table, fc_mask_table + + +def make_loss_fn(n_max, atom_types, wyck_types, Kx, Kl, transformer, lamb_a=1.0, lamb_w=1.0, lamb_l=1.0): + """ + Args: + n_max: maximum number of atoms in the unit cell + atom_types: number of atom types + wyck_types: number of wyckoff types + Kx: number of von mises components for x, y, z + Kl: number of Guassian mixture components for lattice parameters + transformer: model + lamb_a: weight for atom type loss + lamb_w: weight for wyckoff position loss + lamb_l: weight for lattice parameter loss + + Returns: + loss_fn: loss function + logp_fn: log probability function + """ + + coord_types = 3*Kx + lattice_mask = make_lattice_mask() + + def compute_logp_x(h_x, X, fc_mask_x): + x_logit, loc, kappa = jnp.split(h_x, [Kx, 2*Kx], axis=-1) + x_loc = loc.reshape(n_max, Kx) + kappa = kappa.reshape(n_max, Kx) + logp_x = jax.vmap(von_mises_logpdf, (None, 1, 1), 1)((X-0.5)*2*jnp.pi, loc, kappa) # (n_max, Kx) + logp_x = jax.scipy.special.logsumexp(x_logit + logp_x, axis=1) # (n_max, ) + logp_x = jnp.sum(jnp.where(fc_mask_x, logp_x, jnp.zeros_like(logp_x))) + + return logp_x + + @partial(jax.vmap, in_axes=(None, None, 0, 0, 0, 0, 0, None), out_axes=0) # batch + def logp_fn(params, key, G, L, XYZ, A, W, is_train): + ''' + G: scalar + L: (6,) [a, b, c, alpha, beta, gamma] + XYZ: (n_max, 3) + A: (n_max,) + W: (n_max,) + ''' + + num_sites = jnp.sum(A!=0) + M = mult_table[G-1, W] # (n_max,) multplicities + #num_atoms = jnp.sum(M) + + h = transformer(params, key, G, XYZ, A, W, M, is_train) # (5*n_max+1, ...) + w_logit = h[0::5, :wyck_types] # (n_max+1, wyck_types) + w_logit = w_logit[:-1] # (n_max, wyck_types) + a_logit = h[1::5, :atom_types] + h_x = h[2::5, :coord_types] + h_y = h[3::5, :coord_types] + h_z = h[4::5, :coord_types] + + logp_w = jnp.sum(w_logit[jnp.arange(n_max), W.astype(int)]) + logp_a = jnp.sum(a_logit[jnp.arange(n_max), A.astype(int)]) + + X, Y, Z = XYZ[:, 0], XYZ[:, 1], XYZ[:,2] + + fc_mask = jnp.logical_and((W>0)[:, None], fc_mask_table[G-1, W]) # (n_max, 3) + logp_x = compute_logp_x(h_x, X, fc_mask[:, 0]) + logp_y = compute_logp_x(h_y, Y, fc_mask[:, 1]) + logp_z = compute_logp_x(h_z, Z, fc_mask[:, 2]) + + logp_xyz = logp_x + logp_y + logp_z + + l_logit, mu, sigma = jnp.split(h[1::5][num_sites, + atom_types:atom_types+Kl+2*6*Kl], [Kl, Kl+Kl*6], axis=-1) + mu = mu.reshape(Kl, 6) + sigma = sigma.reshape(Kl, 6) + logp_l = jax.vmap(jax.scipy.stats.norm.logpdf, (None, 0, 0))(L,mu,sigma) #(Kl, 6) + logp_l = jax.scipy.special.logsumexp(l_logit[:, None] + logp_l, axis=0) # (6,) + logp_l = jnp.sum(jnp.where((lattice_mask[G-1]>0), logp_l, jnp.zeros_like(logp_l))) + + return logp_w, logp_xyz, logp_a, logp_l + + def loss_fn(params, key, G, L, XYZ, A, W, is_train): + logp_w, logp_xyz, logp_a, logp_l = logp_fn(params, key, G, L, XYZ, A, W, is_train) + loss_w = -jnp.mean(logp_w) + loss_xyz = -jnp.mean(logp_xyz) + loss_a = -jnp.mean(logp_a) + loss_l = -jnp.mean(logp_l) + + return loss_xyz + lamb_a* loss_a + lamb_w*loss_w + lamb_l*loss_l, (loss_w, loss_a, loss_xyz, loss_l) + + return loss_fn, logp_fn + +if __name__=='__main__': + from utils import GLXYZAW_from_file + from transformer import make_transformer + atom_types = 119 + n_max = 20 + wyck_types = 20 + Nf = 5 + Kx = 16 + Kl = 4 + dropout_rate = 0.1 + + csv_file = '../data/mini.csv' + G, L, XYZ, A, W = GLXYZAW_from_file(csv_file, atom_types, wyck_types, n_max) + + key = jax.random.PRNGKey(42) + + params, transformer = make_transformer(key, Nf, Kx, Kl, n_max, 128, 4, 4, 8, 16, 16, atom_types, wyck_types, dropout_rate) + + loss_fn, _ = make_loss_fn(n_max, atom_types, wyck_types, Kx, Kl, transformer) + + value = jax.jit(loss_fn, static_argnums=7)(params, key, G[:1], L[:1], XYZ[:1], A[:1], W[:1], True) + print (value) + + value = jax.jit(loss_fn, static_argnums=7)(params, key, G[:1], L[:1], XYZ[:1]+1.0, A[:1], W[:1], True) + print (value) diff --git a/crystalformerapp/src/main.py b/crystalformerapp/src/main.py new file mode 100644 index 0000000..f7ec2e9 --- /dev/null +++ b/crystalformerapp/src/main.py @@ -0,0 +1,330 @@ +import jax +#jax.config.update("jax_enable_x64", True) +import jax.numpy as jnp +from jax.flatten_util import ravel_pytree +import optax +import os +import multiprocessing +import math + +from .utils import GLXYZAW_from_file, GLXA_to_csv, letter_to_number +from .elements import element_dict, element_list +from .transformer import make_transformer +from .train import train +from .sample import sample_crystal, make_update_lattice +from .loss import make_loss_fn +from .checkpoint import find_ckpt_filename +from .wyckoff import mult_table +from .mcmc import make_mcmc_step + +import argparse +parser = argparse.ArgumentParser(description='') + +group = parser.add_argument_group('training parameters') +group.add_argument('--epochs', type=int, default=10000, help='') +group.add_argument('--batchsize', type=int, default=100, help='') +group.add_argument('--lr', type=float, default=1e-4, help='learning rate') +group.add_argument('--lr_decay', type=float, default=0.0, help='lr decay') +group.add_argument('--weight_decay', type=float, default=0.0, help='weight decay') +group.add_argument('--clip_grad', type=float, default=1.0, help='clip gradient') +group.add_argument("--optimizer", type=str, default="adam", choices=["none", "adam", "adamw"], help="optimizer type") + +group.add_argument("--folder", default="../data/", help="the folder to save data") +group.add_argument("--restore_path", default=None, help="checkpoint path or file") + +group = parser.add_argument_group('dataset') +group.add_argument('--train_path', default='/home/wanglei/cdvae/data/mp_20/train.csv', help='') +group.add_argument('--valid_path', default='/home/wanglei/cdvae/data/mp_20/val.csv', help='') +group.add_argument('--test_path', default='/home/wanglei/cdvae/data/mp_20/test.csv', help='') + +group = parser.add_argument_group('transformer parameters') +group.add_argument('--Nf', type=int, default=5, help='number of frequencies for fc') +group.add_argument('--Kx', type=int, default=16, help='number of modes in x') +group.add_argument('--Kl', type=int, default=4, help='number of modes in lattice') +group.add_argument('--h0_size', type=int, default=256, help='hidden layer dimension for the first atom, 0 means we simply use a table for first aw_logit') +group.add_argument('--transformer_layers', type=int, default=16, help='The number of layers in transformer') +group.add_argument('--num_heads', type=int, default=16, help='The number of heads') +group.add_argument('--key_size', type=int, default=64, help='The key size') +group.add_argument('--model_size', type=int, default=64, help='The model size') +group.add_argument('--embed_size', type=int, default=32, help='The enbedding size') +group.add_argument('--dropout_rate', type=float, default=0.5, help='The dropout rate') + +group = parser.add_argument_group('loss parameters') +group.add_argument("--lamb_a", type=float, default=1.0, help="weight for the a part relative to fc") +group.add_argument("--lamb_w", type=float, default=1.0, help="weight for the w part relative to fc") +group.add_argument("--lamb_l", type=float, default=1.0, help="weight for the lattice part relative to fc") + +group = parser.add_argument_group('physics parameters') +group.add_argument('--n_max', type=int, default=21, help='The maximum number of atoms in the cell') +group.add_argument('--atom_types', type=int, default=119, help='Atom types including the padded atoms') +group.add_argument('--wyck_types', type=int, default=28, help='Number of possible multiplicites including 0') + +group = parser.add_argument_group('sampling parameters') +group.add_argument('--seed', type=int, default=None, help='random seed to sample') +group.add_argument('--spacegroup', type=int, help='The space group id to be sampled (1-230)') +group.add_argument('--wyckoff', type=str, default=None, nargs='+', help='The Wyckoff positions to be sampled, e.g. a, b') +group.add_argument('--elements', type=str, default=None, nargs='+', help='name of the chemical elemenets, e.g. Bi, Ti, O') +group.add_argument('--remove_radioactive', action='store_true', help='remove radioactive elements and noble gas') +group.add_argument('--top_p', type=float, default=1.0, help='1.0 means un-modified logits, smaller value of p give give less diverse samples') +group.add_argument('--temperature', type=float, default=1.0, help='temperature used for sampling') +group.add_argument('--T1', type=float, default=None, help='temperature used for sampling the first atom type') +group.add_argument('--num_io_process', type=int, default=40, help='number of process used in multiprocessing io') +group.add_argument('--num_samples', type=int, default=1000, help='number of test samples') +group.add_argument('--output_filename', type=str, default='output.csv', help='outfile to save sampled structures') + +group = parser.add_argument_group('MCMC parameters') +group.add_argument('--mcmc', action='store_true', help='use MCMC to sample') +group.add_argument('--nsweeps', type=int, default=10, help='number of sweeps') +group.add_argument('--mc_width', type=float, default=0.1, help='width of MCMC step') + +args = parser.parse_args() + +key = jax.random.PRNGKey(42) + +num_cpu = multiprocessing.cpu_count() +print('number of available cpu: ', num_cpu) +if args.num_io_process > num_cpu: + print('num_io_process should not exceed number of available cpu, reset to ', num_cpu) + args.num_io_process = num_cpu + + +################### Data ############################# +if args.optimizer != "none": + train_data = GLXYZAW_from_file(args.train_path, args.atom_types, args.wyck_types, args.n_max, args.num_io_process) + valid_data = GLXYZAW_from_file(args.valid_path, args.atom_types, args.wyck_types, args.n_max, args.num_io_process) +else: + assert (args.spacegroup is not None) # for inference we need to specify space group + test_data = GLXYZAW_from_file(args.test_path, args.atom_types, args.wyck_types, args.n_max, args.num_io_process) + + # jnp.set_printoptions(threshold=jnp.inf) # print full array + constraints = jnp.arange(0, args.n_max, 1) + + if args.elements is not None: + # judge that if the input elements is a json file + if args.elements[0].endswith('.json'): + import json + with open(args.elements[0], 'r') as f: + _data = json.load(f) + atoms_list = _data["atom_mask"] + _constraints = _data["constraints"] + print(_constraints) + + for old_val, new_val in _constraints: + constraints = jnp.where(constraints == new_val, constraints[old_val], constraints) # update constraints + print("constraints", constraints) + + assert len(atoms_list) == len(args.wyckoff) + print ('sampling structure formed by these elements:', atoms_list) + atom_mask = [] + for elements in atoms_list: + idx = [element_dict[e] for e in elements] + atom_mask_ = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask.append(atom_mask_) + + # padding 0 until the atom_mask shape is (args.n_max, args.atom_types) + atom_mask = jnp.array(atom_mask) + atom_mask = jnp.pad(atom_mask, ((0, args.n_max-atom_mask.shape[0]), (0, 0)), mode='constant') + print(atom_mask) + else: + idx = [element_dict[e] for e in args.elements] + atom_mask = [1] + [1 if a in idx else 0 for a in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + print ('sampling structure formed by these elements:', args.elements) + print (atom_mask) + + else: + if args.remove_radioactive: + from elements import radioactive_elements_dict, noble_gas_dict + # remove radioactive elements and noble gas + atom_mask = [1] + [1 if i not in radioactive_elements_dict.values() and i not in noble_gas_dict.values() else 0 for i in range(1, args.atom_types)] + atom_mask = jnp.array(atom_mask) + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + print('sampling structure formed by non-radioactive elements and non-noble gas') + print(atom_mask) + + else: + atom_mask = jnp.zeros((args.atom_types), dtype=int) # we will do nothing to a_logit in sampling + atom_mask = jnp.stack([atom_mask] * args.n_max, axis=0) + print(atom_mask) + # print(f'there is total {jnp.sum(atom_mask)-1} elements') + print(atom_mask.shape) + + if args.wyckoff is not None: + idx = [letter_to_number(w) for w in args.wyckoff] + # padding 0 until the length is args.n_max + w_mask = idx + [0]*(args.n_max -len(idx)) + # w_mask = [1 if w in idx else 0 for w in range(1, args.wyck_types+1)] + w_mask = jnp.array(w_mask, dtype=int) + print ('sampling structure formed by these Wyckoff positions:', args.wyckoff) + print (w_mask) + else: + w_mask = None + +################### Model ############################# +params, transformer = make_transformer(key, args.Nf, args.Kx, args.Kl, args.n_max, + args.h0_size, + args.transformer_layers, args.num_heads, + args.key_size, args.model_size, args.embed_size, + args.atom_types, args.wyck_types, + args.dropout_rate) +transformer_name = 'Nf_%d_Kx_%d_Kl_%d_h0_%d_l_%d_H_%d_k_%d_m_%d_e_%d_drop_%g'%(args.Nf, args.Kx, args.Kl, args.h0_size, args.transformer_layers, args.num_heads, args.key_size, args.model_size, args.embed_size, args.dropout_rate) + +print ("# of transformer params", ravel_pytree(params)[0].size) + +################### Train ############################# + +loss_fn, logp_fn = make_loss_fn(args.n_max, args.atom_types, args.wyck_types, args.Kx, args.Kl, transformer, args.lamb_a, args.lamb_w, args.lamb_l) + +print("\n========== Prepare logs ==========") +if args.optimizer != "none" or args.restore_path is None: + output_path = args.folder + args.optimizer+"_bs_%d_lr_%g_decay_%g_clip_%g" % (args.batchsize, args.lr, args.lr_decay, args.clip_grad) \ + + '_A_%g_W_%g_N_%g'%(args.atom_types, args.wyck_types, args.n_max) \ + + ("_wd_%g"%(args.weight_decay) if args.optimizer == "adamw" else "") \ + + ('_a_%g_w_%g_l_%g'%(args.lamb_a, args.lamb_w, args.lamb_l)) \ + + "_" + transformer_name + + os.makedirs(output_path, exist_ok=True) + print("Create directory for output: %s" % output_path) +else: + output_path = os.path.dirname(args.restore_path) + print("Will output samples to: %s" % output_path) + + +print("\n========== Load checkpoint==========") +ckpt_filename, epoch_finished = find_ckpt_filename(args.restore_path or output_path) +if ckpt_filename is not None: + print("Load checkpoint file: %s, epoch finished: %g" %(ckpt_filename, epoch_finished)) + ckpt = checkpoint.load_data(ckpt_filename) + params = ckpt["params"] +else: + print("No checkpoint file found. Start from scratch.") + +if args.optimizer != "none": + + schedule = lambda t: args.lr/(1+args.lr_decay*t) + + if args.optimizer == "adam": + optimizer = optax.chain(optax.clip_by_global_norm(args.clip_grad), + optax.scale_by_adam(), + optax.scale_by_schedule(schedule), + optax.scale(-1.)) + elif args.optimizer == 'adamw': + optimizer = optax.chain(optax.clip(args.clip_grad), + optax.adamw(learning_rate=schedule, weight_decay=args.weight_decay) + ) + + opt_state = optimizer.init(params) + try: + opt_state.update(ckpt["opt_state"]) + except: + print ("failed to update opt_state from checkpoint") + pass + + print("\n========== Start training ==========") + params, opt_state = train(key, optimizer, opt_state, loss_fn, params, epoch_finished, args.epochs, args.batchsize, train_data, valid_data, output_path) + +else: + pass + + print("\n========== Calculate the loss of test dataset ==========") + import numpy as np + np.set_printoptions(threshold=np.inf) + + test_G, test_L, test_XYZ, test_A, test_W = test_data + print (test_G.shape, test_L.shape, test_XYZ.shape, test_A.shape, test_W.shape) + test_loss = 0 + num_samples = len(test_L) + num_batches = math.ceil(num_samples / args.batchsize) + for batch_idx in range(num_batches): + start_idx = batch_idx * args.batchsize + end_idx = min(start_idx + args.batchsize, num_samples) + G, L, XYZ, A, W = test_G[start_idx:end_idx], \ + test_L[start_idx:end_idx], \ + test_XYZ[start_idx:end_idx], \ + test_A[start_idx:end_idx], \ + test_W[start_idx:end_idx] + loss, _ = jax.jit(loss_fn, static_argnums=7)(params, key, G, L, XYZ, A, W, False) + test_loss += loss + test_loss = test_loss / num_batches + print ("evaluating loss on test data:" , test_loss) + + print("\n========== Start sampling ==========") + jax.config.update("jax_enable_x64", True) # to get off compilation warning, and to prevent sample nan lattice + #FYI, the error was [Compiling module extracted] Very slow compile? If you want to file a bug, run with envvar XLA_FLAGS=--xla_dump_to=/tmp/foo and attach the results. + + if args.seed is not None: + key = jax.random.PRNGKey(args.seed) # reset key for sampling if seed is provided + + if args.T1 is not None: + T1 = args.T1 + else: + T1 = args.temperature + + mc_steps = args.nsweeps * args.n_max + print("mc_steps", mc_steps) + mcmc = make_mcmc_step(params, n_max=args.n_max, atom_types=args.atom_types, atom_mask=atom_mask, constraints=constraints) + update_lattice = make_update_lattice(transformer, params, args.atom_types, args.Kl, args.top_p, args.temperature) + + num_batches = math.ceil(args.num_samples / args.batchsize) + name, extension = args.output_filename.rsplit('.', 1) + filename = os.path.join(output_path, + f"{name}_{args.spacegroup}.{extension}") + for batch_idx in range(num_batches): + start_idx = batch_idx * args.batchsize + end_idx = min(start_idx + args.batchsize, args.num_samples) + n_sample = end_idx - start_idx + key, subkey = jax.random.split(key) + XYZ, A, W, M, L = sample_crystal(subkey, transformer, params, args.n_max, n_sample, args.atom_types, args.wyck_types, args.Kx, args.Kl, args.spacegroup, w_mask, atom_mask, args.top_p, args.temperature, T1, constraints) + + G = args.spacegroup * jnp.ones((n_sample), dtype=int) + if args.mcmc: + x = (G, L, XYZ, A, W) + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x, key=subkey, mc_steps=mc_steps, mc_width=args.mc_width) + print("acc", acc) + + G, L, XYZ, A, W = x + key, subkey = jax.random.split(key) + L = update_lattice(subkey, G, XYZ, A, W) + + print ("XYZ:\n", XYZ) # fractional coordinate + print ("A:\n", A) # element type + print ("W:\n", W) # Wyckoff positions + print ("M:\n", M) # multiplicity + print ("N:\n", M.sum(axis=-1)) # total number of atoms + print ("L:\n", L) # lattice + for a in A: + print([element_list[i] for i in a]) + + # output L, X, A, W, M, AW to csv file + # output logp_w, logp_xyz, logp_a, logp_l to csv file + import pandas as pd + data = pd.DataFrame() + data['L'] = np.array(L).tolist() + data['X'] = np.array(XYZ).tolist() + data['A'] = np.array(A).tolist() + data['W'] = np.array(W).tolist() + data['M'] = np.array(M).tolist() + + num_atoms = jnp.sum(M, axis=1) + length, angle = jnp.split(L, 2, axis=-1) + length = length/num_atoms[:, None]**(1/3) + angle = angle * (jnp.pi / 180) # to rad + L = jnp.concatenate([length, angle], axis=-1) + + # G = args.spacegroup * jnp.ones((n_sample), dtype=int) + logp_w, logp_xyz, logp_a, logp_l = jax.jit(logp_fn, static_argnums=7)(params, key, G, L, XYZ, A, W, False) + + data['logp_w'] = np.array(logp_w).tolist() + data['logp_xyz'] = np.array(logp_xyz).tolist() + data['logp_a'] = np.array(logp_a).tolist() + data['logp_l'] = np.array(logp_l).tolist() + data['logp'] = np.array(logp_xyz + args.lamb_w*logp_w + args.lamb_a*logp_a + args.lamb_l*logp_l).tolist() + + data = data.sort_values(by='logp', ascending=False) # sort by logp + header = False if os.path.exists(filename) else True + data.to_csv(filename, mode='a', index=False, header=header) + + # GLXA_to_csv(args.spacegroup, L, XYZ, A, num_worker=args.num_io_process, filename=filename) + print ("Wrote samples to %s"%filename) \ No newline at end of file diff --git a/crystalformerapp/src/mcmc.py b/crystalformerapp/src/mcmc.py new file mode 100644 index 0000000..7b97416 --- /dev/null +++ b/crystalformerapp/src/mcmc.py @@ -0,0 +1,148 @@ +import jax +import jax.numpy as jnp +from functools import partial + +from .wyckoff import fc_mask_table +from .von_mises import sample_von_mises + + +get_fc_mask = lambda g, w: jnp.logical_and((w>0)[:, None], fc_mask_table[g-1, w]) + +def make_mcmc_step(params, n_max, atom_types, atom_mask=None, constraints=None): + + if atom_mask is None or jnp.all(atom_mask == 0): + atom_mask = jnp.ones((n_max, atom_types)) + + if constraints is None: + constraints = jnp.arange(0, n_max, 1) + + def update_A(i, A, a, constraints): + def body_fn(j, A): + A = jax.lax.cond(constraints[j] == constraints[i], + lambda _: A.at[:, j].set(a), + lambda _: A, + None) + return A + + A = jax.lax.fori_loop(0, A.shape[1], body_fn, A) + return A + + @partial(jax.jit, static_argnums=0) + def mcmc(logp_fn, x_init, key, mc_steps, mc_width): + """ + Markov Chain Monte Carlo sampling algorithm. + + INPUT: + logp_fn: callable that evaluate log-probability of a batch of configuration x. + The signature is logp_fn(x), where x has shape (batch, n, dim). + x_init: initial value of x, with shape (batch, n, dim). + key: initial PRNG key. + mc_steps: total number of Monte Carlo steps. + mc_width: size of the Monte Carlo proposal. + + OUTPUT: + x: resulting batch samples, with the same shape as `x_init`. + """ + def step(i, state): + + def true_func(i, state): + x, logp, key, num_accepts = state + G, L, XYZ, A, W = x + key, key_proposal_A, key_proposal_XYZ, key_accept, key_logp = jax.random.split(key, 5) + + p_normalized = atom_mask[i%n_max] / jnp.sum(atom_mask[i%n_max]) # only propose atom types that are allowed + _a = jax.random.choice(key_proposal_A, a=atom_types, p=p_normalized, shape=(A.shape[0], )) + # _A = A.at[:, i%n_max].set(_a) + _A = update_A(i%n_max, A, _a, constraints) + A_proposal = jnp.where(A == 0, A, _A) + + fc_mask = jax.vmap(get_fc_mask, in_axes=(0, 0))(G, W) + _xyz = XYZ[:, i%n_max] + sample_von_mises(key_proposal_XYZ, 0, 1/mc_width**2, XYZ[:, i%n_max].shape) + _XYZ = XYZ.at[:, i%n_max].set(_xyz) + _XYZ -= jnp.floor(_XYZ) # wrap to [0, 1) + XYZ_proposal = jnp.where(fc_mask, _XYZ, XYZ) + x_proposal = (G, L, XYZ_proposal, A_proposal, W) + + logp_w, logp_xyz, logp_a, _ = logp_fn(params, key_logp, *x_proposal, False) + logp_proposal = logp_w + logp_xyz + logp_a + + ratio = jnp.exp((logp_proposal - logp)) + accept = jax.random.uniform(key_accept, ratio.shape) < ratio + + A_new = jnp.where(accept[:, None], A_proposal, A) # update atom types + XYZ_new = jnp.where(accept[:, None, None], XYZ_proposal, XYZ) # update atom positions + x_new = (G, L, XYZ_new, A_new, W) + logp_new = jnp.where(accept, logp_proposal, logp) + num_accepts += jnp.sum(accept*jnp.where(A[:, i%n_max]==0, 0, 1)) + return x_new, logp_new, key, num_accepts + + def false_func(i, state): + x, logp, key, num_accepts = state + return x, logp, key, num_accepts + + x, logp, key, num_accepts = state + A = x[3] + x, logp, key, num_accepts = jax.lax.cond(A[:, i%n_max].sum() != 0, + lambda _: true_func(i, state), + lambda _: false_func(i, state), + None) + return x, logp, key, num_accepts + + key, subkey = jax.random.split(key) + logp_w, logp_xyz, logp_a, _ = logp_fn(params, subkey, *x_init, False) + logp_init = logp_w + logp_xyz + logp_a + # print("logp_init", logp_init) + + x, logp, key, num_accepts = jax.lax.fori_loop(0, mc_steps, step, (x_init, logp_init, key, 0.)) + # print("logp", logp) + A = x[3] + scale = jnp.sum(A != 0)/(A.shape[0]*n_max) + accept_rate = num_accepts / (scale * mc_steps * x[0].shape[0]) + return x, accept_rate + + return mcmc + + +if __name__ == "__main__": + from utils import GLXYZAW_from_file + from loss import make_loss_fn + from transformer import make_transformer + atom_types = 119 + n_max = 21 + wyck_types = 28 + Nf = 5 + Kx = 16 + Kl = 4 + dropout_rate = 0.3 + + csv_file = '../data/mini.csv' + G, L, XYZ, A, W = GLXYZAW_from_file(csv_file, atom_types, wyck_types, n_max) + + key = jax.random.PRNGKey(42) + + params, transformer = make_transformer(key, Nf, Kx, Kl, n_max, 128, 4, 4, 8, 16, 16, atom_types, wyck_types, dropout_rate) + + loss_fn, logp_fn = make_loss_fn(n_max, atom_types, wyck_types, Kx, Kl, transformer) + + # MCMC sampling test + mc_steps = 21 + mc_width = 0.1 + x_init = (G[:5], L[:5], XYZ[:5], A[:5], W[:5]) + + value = jax.jit(logp_fn, static_argnums=7)(params, key, *x_init, False) + + jnp.set_printoptions(threshold=jnp.inf) + mcmc = make_mcmc_step(params, n_max=n_max, atom_types=atom_types) + + for i in range(5): + key, subkey = jax.random.split(key) + x, acc = mcmc(logp_fn, x_init=x_init, key=subkey, mc_steps=mc_steps, mc_width=mc_width) + print(i, acc) + + print("check if the atom type is changed") + print(x_init[3]) + print(x[3]) + + print("check if the atom position is changed") + print(x_init[2]) + print(x[2]) \ No newline at end of file diff --git a/crystalformerapp/src/sample.py b/crystalformerapp/src/sample.py new file mode 100644 index 0000000..51f27bb --- /dev/null +++ b/crystalformerapp/src/sample.py @@ -0,0 +1,221 @@ +import jax +import jax.numpy as jnp +from functools import partial + +from crystalformerapp.src.von_mises import sample_von_mises +from crystalformerapp.src.lattice import symmetrize_lattice +from crystalformerapp.src.wyckoff import mult_table, symops + +def project_xyz(g, w, x, idx): + ''' + apply the randomly sampled Wyckoff symmetry op to sampled fc, which + should be (or close to) the first WP + ''' + op = symops[g-1, w, idx].reshape(3, 4) + affine_point = jnp.array([*x, 1]) # (4, ) + x = jnp.dot(op, affine_point) # (3, ) + x -= jnp.floor(x) + return x + +@partial(jax.vmap, in_axes=(None, None, None, 0, 0, 0, 0, 0), out_axes=0) # batch +def inference(model, params, g, W, A, X, Y, Z): + XYZ = jnp.concatenate([X[:, None], + Y[:, None], + Z[:, None] + ], + axis=-1) + M = mult_table[g-1, W] + return model(params, None, g, XYZ, A, W, M, False) + +def sample_top_p(key, logits, p, temperature): + ''' + drop remaining logits once the cumulative_probs is larger than p + for very small p, we may drop everything excet the leading logit + for very large p, we will keep everything + ''' + assert (logits.ndim == 2) + if p < 1.0: + batchsize = logits.shape[0] + batch_idx = jnp.arange(batchsize)[:, None] + indices = jnp.argsort(logits, axis=1)[:, ::-1] + cumulative_probs = jnp.cumsum(jax.nn.softmax(logits[batch_idx, indices], axis=1), axis=1) + mask = jnp.concatenate([jnp.zeros((batchsize, 1)), # at least keep the leading one + (cumulative_probs > p)[:, :-1] + ], axis=1) + mask = mask.at[batch_idx, indices].set(mask) # logits to be dropped + logits = logits + jnp.where(mask, -1e10, 0.0) + + samples = jax.random.categorical(key, logits/temperature, axis=1) + return samples + +def sample_x(key, h_x, Kx, top_p, temperature, batchsize): + coord_types = 3*Kx + x_logit, loc, kappa = jnp.split(h_x[:, :coord_types], [Kx, 2*Kx], axis=-1) + key, key_k, key_x = jax.random.split(key, 3) + k = sample_top_p(key_k, x_logit, top_p, temperature) + loc = loc.reshape(batchsize, Kx)[jnp.arange(batchsize), k] + kappa = kappa.reshape(batchsize, Kx)[jnp.arange(batchsize), k] + x = sample_von_mises(key_x, loc, kappa/temperature, (batchsize,)) + x = (x+ jnp.pi)/(2.0*jnp.pi) # wrap into [0, 1] + return key, x + +@partial(jax.jit, static_argnums=(1, 3, 4, 5, 6, 7, 8, 9, 12, 14)) +def sample_crystal(key, transformer, params, n_max, batchsize, atom_types, wyck_types, Kx, Kl, g, w_mask, atom_mask, top_p, temperature, T1, constraints): + + def body_fn(i, state): + key, W, A, X, Y, Z, L = state + + # (1) W + w_logit = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i] # (batchsize, output_size) + w_logit = w_logit[:, :wyck_types] + + key, subkey = jax.random.split(key) + if w_mask is not None: + w_logit = w_logit.at[:, w_mask[i]].set(w_logit[:, w_mask[i]] + 1e10) + w = sample_top_p(subkey, w_logit, top_p, temperature) + W = W.at[:, i].set(w) + + # (2) A + h_al = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+1] # (batchsize, output_size) + a_logit = h_al[:, :atom_types] + + key, subkey = jax.random.split(key) + a_logit = a_logit + jnp.where(atom_mask[i, :], 1e10, 0.0) # enhance the probability of masked atoms (do not need to normalize since we only use it for sampling, not computing logp) + _temp = jax.lax.cond(i==0, + true_fun=lambda x: jnp.array(T1, dtype=float), + false_fun=lambda x: temperature, + operand=None) + _a = sample_top_p(subkey, a_logit, top_p, _temp) # use T1 for the first atom type + a = jax.lax.cond(constraints[i] < i, + lambda x, y: y, + lambda x, y: x, + _a, A[:, constraints[i]]) + A = A.at[:, i].set(a) + + lattice_params = h_al[:, atom_types:atom_types+Kl+2*6*Kl] + L = L.at[:, i].set(lattice_params) + + # (3) X + h_x = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+2] # (batchsize, output_size) + key, x = sample_x(key, h_x, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([x[:, None], + jnp.zeros((batchsize, 1)), + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + x = xyz[:, 0] + X = X.at[:, i].set(x) + + # (4) Y + h_y = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+3] # (batchsize, output_size) + key, y = sample_x(key, h_y, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, i][:, None], + y[:, None], + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + y = xyz[:, 1] + Y = Y.at[:, i].set(y) + + # (5) Z + h_z = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+4] # (batchsize, output_size) + key, z = sample_x(key, h_z, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, i][:, None], + Y[:, i][:, None], + z[:, None], + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + z = xyz[:, 2] + Z = Z.at[:, i].set(z) + + return key, W, A, X, Y, Z, L + + # we waste computation time by always working with the maximum length sequence, but we save compilation time + W = jnp.zeros((batchsize, n_max), dtype=int) + A = jnp.zeros((batchsize, n_max), dtype=int) + X = jnp.zeros((batchsize, n_max)) + Y = jnp.zeros((batchsize, n_max)) + Z = jnp.zeros((batchsize, n_max)) + L = jnp.zeros((batchsize, n_max, Kl+2*6*Kl)) # we accumulate lattice params and sample lattice after + + key, W, A, X, Y, Z, L = jax.lax.fori_loop(0, n_max, body_fn, (key, W, A, X, Y, Z, L)) + + M = mult_table[g-1, W] + num_sites = jnp.sum(A!=0, axis=1) + num_atoms = jnp.sum(M, axis=1) + + l_logit, mu, sigma = jnp.split(L[jnp.arange(batchsize), num_sites, :], [Kl, Kl+6*Kl], axis=-1) + + key, key_k, key_l = jax.random.split(key, 3) + # k is (batchsize, ) integer array whose value in [0, Kl) + k = sample_top_p(key_k, l_logit, top_p, temperature) + + mu = mu.reshape(batchsize, Kl, 6) + mu = mu[jnp.arange(batchsize), k] # (batchsize, 6) + sigma = sigma.reshape(batchsize, Kl, 6) + sigma = sigma[jnp.arange(batchsize), k] # (batchsize, 6) + L = jax.random.normal(key_l, (batchsize, 6)) * sigma*jnp.sqrt(temperature) + mu # (batchsize, 6) + + #scale length according to atom number since we did reverse of that when loading data + length, angle = jnp.split(L, 2, axis=-1) + length = length*num_atoms[:, None]**(1/3) + angle = angle * (180.0 / jnp.pi) # to deg + L = jnp.concatenate([length, angle], axis=-1) + + #impose space group constraint to lattice params + L = jax.vmap(symmetrize_lattice, (None, 0))(g, L) + + XYZ = jnp.concatenate([X[..., None], + Y[..., None], + Z[..., None] + ], + axis=-1) + + return XYZ, A, W, M, L + + +def make_update_lattice(transformer, params, atom_types, Kl, top_p, temperature): + + @jax.jit + def update_lattice(key, G, XYZ, A, W): + + num_sites = jnp.sum(A!=0, axis=1) # (batchsize, ) + M = jax.vmap(lambda g, w: mult_table[g-1, w], in_axes=(0, 0))(G, W) # (batchsize, n_max) + #num_atoms = jnp.sum(M) + batchsize = XYZ.shape[0] + + h = jax.vmap(transformer, in_axes=(None, None, 0, 0, 0, 0, 0, None))(params, key, G, XYZ, A, W, M, False) + + l_logit, mu, sigma = jax.vmap(lambda h, num_site: jnp.split(h[1::5][num_site, + atom_types:atom_types+Kl+2*6*Kl], [Kl, Kl+Kl*6], axis=-1), + in_axes=(0, 0))(h, num_sites) + + key, key_k, key_l = jax.random.split(key, 3) + # k is (batchsize, ) integer array whose value in [0, Kl) + k = sample_top_p(key_k, l_logit, top_p, temperature) + + mu = mu.reshape(batchsize, Kl, 6) + mu = mu[jnp.arange(batchsize), k] # (batchsize, 6) + sigma = sigma.reshape(batchsize, Kl, 6) + sigma = sigma[jnp.arange(batchsize), k] # (batchsize, 6) + L = jax.random.normal(key_l, (batchsize, 6)) * sigma*jnp.sqrt(temperature) + mu # (batchsize, 6) + + num_atoms = jnp.sum(M, axis=1) + #scale length according to atom number since we did reverse of that when loading data + length, angle = jnp.split(L, 2, axis=-1) + length = length*num_atoms[:, None]**(1/3) + angle = angle * (180.0 / jnp.pi) # to deg + L = jnp.concatenate([length, angle], axis=-1) + + #impose space group constraint to lattice params + L = jax.vmap(symmetrize_lattice, (0, 0))(G, L) + + return L + + return update_lattice \ No newline at end of file diff --git a/crystalformerapp/src/simple_sample.py b/crystalformerapp/src/simple_sample.py new file mode 100644 index 0000000..de419fc --- /dev/null +++ b/crystalformerapp/src/simple_sample.py @@ -0,0 +1,276 @@ +import jax +import jax.numpy as jnp +from functools import partial + +from .von_mises import sample_von_mises +from .lattice import symmetrize_lattice +from .wyckoff import mult_table, symops + +def project_xyz(g, w, x, idx): + ''' + apply the randomly sampled Wyckoff symmetry op to sampled fc, which + should be (or close to) the first WP + ''' + op = symops[g-1, w, idx].reshape(3, 4) + affine_point = jnp.array([*x, 1]) # (4, ) + x = jnp.dot(op, affine_point) # (3, ) + x -= jnp.floor(x) + return x + +@partial(jax.vmap, in_axes=(None, None, None, 0, 0, 0, 0, 0), out_axes=0) # batch +def inference(model, params, g, W, A, X, Y, Z): + XYZ = jnp.concatenate([X[:, None], + Y[:, None], + Z[:, None] + ], + axis=-1) + M = mult_table[g-1, W] + return model(params, None, g, XYZ, A, W, M, False) + +def sample_top_p(key, logits, p, temperature): + ''' + drop remaining logits once the cumulative_probs is larger than p + for very small p, we may drop everything excet the leading logit + for very large p, we will keep everything + ''' + assert (logits.ndim == 2) + if p < 1.0: + batchsize = logits.shape[0] + batch_idx = jnp.arange(batchsize)[:, None] + indices = jnp.argsort(logits, axis=1)[:, ::-1] + cumulative_probs = jnp.cumsum(jax.nn.softmax(logits[batch_idx, indices], axis=1), axis=1) + mask = jnp.concatenate([jnp.zeros((batchsize, 1)), # at least keep the leading one + (cumulative_probs > p)[:, :-1] + ], axis=1) + mask = mask.at[batch_idx, indices].set(mask) # logits to be dropped + logits = logits + jnp.where(mask, -1e10, 0.0) + + samples = jax.random.categorical(key, logits/temperature, axis=1) + return samples + +def sample_x(key, h_x, Kx, top_p, temperature, batchsize): + coord_types = 3*Kx + x_logit, loc, kappa = jnp.split(h_x[:, :coord_types], [Kx, 2*Kx], axis=-1) + key, key_k, key_x = jax.random.split(key, 3) + k = sample_top_p(key_k, x_logit, top_p, temperature) + loc = loc.reshape(batchsize, Kx)[jnp.arange(batchsize), k] + kappa = kappa.reshape(batchsize, Kx)[jnp.arange(batchsize), k] + x = sample_von_mises(key_x, loc, kappa/temperature, (batchsize,)) + x = (x+ jnp.pi)/(2.0*jnp.pi) # wrap into [0, 1] + return key, x + +@partial(jax.jit, static_argnums=(1, 3, 4, 5, 6, 7, 8, 9, 12, 14, 15)) +def sample_crystal(key, transformer, params, n_max, batchsize, atom_types, wyck_types, Kx, Kl, g, w_mask, atom_mask, top_p, temperature, T1, use_foriloop): + + if use_foriloop: + + def body_fn(i, state): + key, W, A, X, Y, Z, L = state + + # (1) W + w_logit = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i] # (batchsize, output_size) + w_logit = w_logit[:, :wyck_types] + + key, subkey = jax.random.split(key) + if w_mask is not None: + w_logit = w_logit.at[:, w_mask[i]].set(w_logit[:, w_mask[i]] + 1e10) + w = sample_top_p(subkey, w_logit, top_p, temperature) + W = W.at[:, i].set(w) + + # (2) A + h_al = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+1] # (batchsize, output_size) + a_logit = h_al[:, :atom_types] + + key, subkey = jax.random.split(key) + a_logit = a_logit + jnp.where(atom_mask, 1e10, 0.0) # enhance the probability of masked atoms (do not need to normalize since we only use it for sampling, not computing logp) + _temp = jax.lax.cond(i==0, + true_fun=lambda x: jnp.array(T1, dtype=float), + false_fun=lambda x: jnp.array(temperature, dtype=float), + operand=None) + a = sample_top_p(subkey, a_logit, top_p, _temp) # use T1 for the first atom type + A = A.at[:, i].set(a) + + lattice_params = h_al[:, atom_types:atom_types+Kl+2*6*Kl] + L = L.at[:, i].set(lattice_params) + + # (3) X + h_x = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+2] # (batchsize, output_size) + key, x = sample_x(key, h_x, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([x[:, None], + jnp.zeros((batchsize, 1)), + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + x = xyz[:, 0] + X = X.at[:, i].set(x) + + # (4) Y + h_y = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+3] # (batchsize, output_size) + key, y = sample_x(key, h_y, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, i][:, None], + y[:, None], + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + y = xyz[:, 1] + Y = Y.at[:, i].set(y) + + # (5) Z + h_z = inference(transformer, params, g, W, A, X, Y, Z)[:, 5*i+4] # (batchsize, output_size) + key, z = sample_x(key, h_z, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, i][:, None], + Y[:, i][:, None], + z[:, None], + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + z = xyz[:, 2] + Z = Z.at[:, i].set(z) + + return key, W, A, X, Y, Z, L + + # we waste computation time by always working with the maximum length sequence, but we save compilation time + W = jnp.zeros((batchsize, n_max), dtype=int) + A = jnp.zeros((batchsize, n_max), dtype=int) + X = jnp.zeros((batchsize, n_max)) + Y = jnp.zeros((batchsize, n_max)) + Z = jnp.zeros((batchsize, n_max)) + L = jnp.zeros((batchsize, n_max, Kl+2*6*Kl)) # we accumulate lattice params and sample lattice after + + key, W, A, X, Y, Z, L = jax.lax.fori_loop(0, n_max, body_fn, (key, W, A, X, Y, Z, L)) + + else: # manual loop with increasing length + + W = jnp.zeros((batchsize, 0), dtype=int) + A = jnp.zeros((batchsize, 0), dtype=int) + X = jnp.zeros((batchsize, 0)) + Y = jnp.zeros((batchsize, 0)) + Z = jnp.zeros((batchsize, 0)) + L = jnp.zeros((batchsize, 0, Kl+2*6*Kl)) # we accumulate lattice params and sample lattice after + + for i in range(n_max): + + # (1) W + w_logit = inference(transformer, params, g, W, A, X, Y, Z)[:, -1] # (batchsize, output_size) + w_logit = w_logit[:, :wyck_types] + + key, subkey = jax.random.split(key) + if w_mask is not None: + w_logit = w_logit.at[:, w_mask[i]].set(w_logit[:, w_mask[i]] + 1e10) + w = sample_top_p(subkey, w_logit, top_p, temperature) + + W = jnp.concatenate([W, w[:, None]], axis=1) + + # (2) A + Apad = jnp.concatenate([A, jnp.zeros((batchsize, 1), dtype=int)], axis=1) + Xpad = jnp.concatenate([X, jnp.zeros((batchsize, 1))], axis=1) + Ypad = jnp.concatenate([Y, jnp.zeros((batchsize, 1))], axis=1) + Zpad = jnp.concatenate([Z, jnp.zeros((batchsize, 1))], axis=1) + + h_al = inference(transformer, params, g, W, Apad, Xpad, Ypad, Zpad)[:, -5] # (batchsize, output_size) + + a_logit = h_al[:, :atom_types] + + key, subkey = jax.random.split(key) + a_logit = a_logit + jnp.where(atom_mask, 1e10, 0.0) # enhance the probability of masked atoms (do not need to normalize since we only use it for sampling, not computing logp) + _temp = jax.lax.cond(i==0, + true_fun=lambda x: jnp.array(T1, dtype=float), + false_fun=lambda x: jnp.array(temperature, dtype=float), + operand=None) + a = sample_top_p(subkey, a_logit, top_p, _temp) # use T1 for the first atom type + A = jnp.concatenate([A, a[:, None]], axis=1) + + lattice_params = h_al[:, atom_types:atom_types+Kl+2*6*Kl] + L = jnp.concatenate([L, lattice_params[:, None, :]], axis=1) + + # (3) X + + Xpad = jnp.concatenate([X, jnp.zeros((batchsize, 1))], axis=1) + Ypad = jnp.concatenate([Y, jnp.zeros((batchsize, 1))], axis=1) + Zpad = jnp.concatenate([Z, jnp.zeros((batchsize, 1))], axis=1) + + h_x = inference(transformer, params, g, W, A, Xpad, Ypad, Zpad)[:, -4] # (batchsize, output_size) + key, x = sample_x(key, h_x, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([x[:, None], + jnp.zeros((batchsize, 1)), + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + x = xyz[:, 0] + X = jnp.concatenate([X, x[:, None]], axis=1) + + # (4) Y + + Ypad = jnp.concatenate([Y, jnp.zeros((batchsize, 1))], axis=1) + Zpad = jnp.concatenate([Z, jnp.zeros((batchsize, 1))], axis=1) + + h_y = inference(transformer, params, g, W, A, X, Ypad, Zpad)[:, -3] # (batchsize, output_size) + key, y = sample_x(key, h_y, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, -1][:, None], + y[:, None], + jnp.zeros((batchsize, 1)), + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + y = xyz[:, 1] + + Y = jnp.concatenate([Y, y[:, None]], axis=1) + + # (5) Z + + Zpad = jnp.concatenate([Z, jnp.zeros((batchsize, 1))], axis=1) + + h_z = inference(transformer, params, g, W, A, X, Y, Zpad)[:, -2] # (batchsize, output_size) + key, z = sample_x(key, h_z, Kx, top_p, temperature, batchsize) + + # project to the first WP + xyz = jnp.concatenate([X[:, -1][:, None], + Y[:, -1][:, None], + z[:, None], + ], axis=-1) + xyz = jax.vmap(project_xyz, in_axes=(None, 0, 0, None), out_axes=0)(g, w, xyz, 0) + z = xyz[:, 2] + + Z = jnp.concatenate([Z, z[:, None]], axis=1) + + + M = mult_table[g-1, W] + num_sites = jnp.sum(A!=0, axis=1) + num_atoms = jnp.sum(M, axis=1) + + l_logit, mu, sigma = jnp.split(L[jnp.arange(batchsize), num_sites, :], [Kl, Kl+6*Kl], axis=-1) + + key, key_k, key_l = jax.random.split(key, 3) + # k is (batchsize, ) integer array whose value in [0, Kl) + k = sample_top_p(key_k, l_logit, top_p, temperature) + + mu = mu.reshape(batchsize, Kl, 6) + mu = mu[jnp.arange(batchsize), k] # (batchsize, 6) + sigma = sigma.reshape(batchsize, Kl, 6) + sigma = sigma[jnp.arange(batchsize), k] # (batchsize, 6) + L = jax.random.normal(key_l, (batchsize, 6)) * sigma*jnp.sqrt(temperature) + mu # (batchsize, 6) + + #scale length according to atom number since we did reverse of that when loading data + length, angle = jnp.split(L, 2, axis=-1) + length = length*num_atoms[:, None]**(1/3) + angle = angle * (180.0 / jnp.pi) # to deg + L = jnp.concatenate([length, angle], axis=-1) + + #impose space group constraint to lattice params + L = jax.vmap(symmetrize_lattice, (None, 0))(g, L) + + XYZ = jnp.concatenate([X[..., None], + Y[..., None], + Z[..., None] + ], + axis=-1) + + return XYZ, A, W, M, L \ No newline at end of file diff --git a/crystalformerapp/src/train.py b/crystalformerapp/src/train.py new file mode 100644 index 0000000..1a8f377 --- /dev/null +++ b/crystalformerapp/src/train.py @@ -0,0 +1,105 @@ +import jax +import jax.numpy as jnp +from functools import partial +import os +import optax +import math + +from .utils import shuffle +from .checkpoint import save_data + +def train(key, optimizer, opt_state, loss_fn, params, epoch_finished, epochs, batchsize, train_data, valid_data, path): + + @jax.jit + def update(params, key, opt_state, data): + G, L, X, A, W = data + value, grad = jax.value_and_grad(loss_fn, has_aux=True)(params, key, G, L, X, A, W, True) + updates, opt_state = optimizer.update(grad, opt_state, params) + params = optax.apply_updates(params, updates) + return params, opt_state, value + + log_filename = os.path.join(path, "data.txt") + f = open(log_filename, "w" if epoch_finished == 0 else "a", buffering=1, newline="\n") + if os.path.getsize(log_filename) == 0: + f.write("epoch t_loss v_loss t_loss_w v_loss_w t_loss_a v_loss_a t_loss_xyz v_loss_xyz t_loss_l v_loss_l\n") + + for epoch in range(epoch_finished+1, epochs): + key, subkey = jax.random.split(key) + train_data = shuffle(subkey, train_data) + + train_G, train_L, train_X, train_A, train_W = train_data + + train_loss = 0.0 + train_aux = 0.0, 0.0, 0.0, 0.0 + num_samples = len(train_L) + num_batches = math.ceil(num_samples / batchsize) + for batch_idx in range(num_batches): + start_idx = batch_idx * batchsize + end_idx = min(start_idx + batchsize, num_samples) + data = train_G[start_idx:end_idx], \ + train_L[start_idx:end_idx], \ + train_X[start_idx:end_idx], \ + train_A[start_idx:end_idx], \ + train_W[start_idx:end_idx] + + key, subkey = jax.random.split(key) + params, opt_state, (loss, aux) = update(params, subkey, opt_state, data) + train_loss, train_aux = jax.tree_map( + lambda acc, i: acc + i, + (train_loss, train_aux), + (loss, aux) + ) + + train_loss, train_aux = jax.tree_map( + lambda x: x/num_batches, + (train_loss, train_aux) + ) + + if epoch % 100 == 0: + valid_G, valid_L, valid_X, valid_A, valid_W = valid_data + valid_loss = 0.0 + valid_aux = 0.0, 0.0, 0.0, 0.0 + num_samples = len(valid_L) + num_batches = math.ceil(num_samples / batchsize) + for batch_idx in range(num_batches): + start_idx = batch_idx * batchsize + end_idx = min(start_idx + batchsize, num_samples) + G, L, X, A, W = valid_G[start_idx:end_idx], \ + valid_L[start_idx:end_idx], \ + valid_X[start_idx:end_idx], \ + valid_A[start_idx:end_idx], \ + valid_W[start_idx:end_idx] + + key, subkey = jax.random.split(key) + loss, aux = loss_fn(params, subkey, G, L, X, A, W, False) + valid_loss, valid_aux = jax.tree_map( + lambda acc, i: acc + i, + (valid_loss, valid_aux), + (loss, aux) + ) + + valid_loss, valid_aux = jax.tree_map( + lambda x: x/num_batches, + (valid_loss, valid_aux) + ) + + train_loss_w, train_loss_a, train_loss_xyz, train_loss_l = train_aux + valid_loss_w, valid_loss_a, valid_loss_xyz, valid_loss_l = valid_aux + + f.write( ("%6d" + 10*" %.6f" + "\n") % (epoch, + train_loss, valid_loss, + train_loss_w, valid_loss_w, + train_loss_a, valid_loss_a, + train_loss_xyz, valid_loss_xyz, + train_loss_l, valid_loss_l + )) + + ckpt = {"params": params, + "opt_state" : opt_state + } + ckpt_filename = os.path.join(path, "epoch_%06d.pkl" %(epoch)) + save_data(ckpt, ckpt_filename) + print("Save checkpoint file: %s" % ckpt_filename) + + f.close() + return params, opt_state diff --git a/crystalformerapp/src/transformer.py b/crystalformerapp/src/transformer.py new file mode 100644 index 0000000..f3e257c --- /dev/null +++ b/crystalformerapp/src/transformer.py @@ -0,0 +1,241 @@ +''' +https://github.com/google-deepmind/dm-haiku/blob/main/examples/transformer/model.py +''' +import jax +import jax.numpy as jnp +import haiku as hk +import numpy as np + +from crystalformerapp.src.attention import MultiHeadAttention +from crystalformerapp.src.wyckoff import wmax_table, dof0_table + +def make_transformer(key, Nf, Kx, Kl, n_max, h0_size, num_layers, num_heads, key_size, model_size, embed_size, atom_types, wyck_types, dropout_rate, widening_factor=4, sigmamin=1e-3): + + coord_types = 3*Kx + lattice_types = Kl+2*6*Kl + output_size = np.max(np.array([atom_types+lattice_types, coord_types, wyck_types])) + + def renormalize(h_x): + n = h_x.shape[0] + x_logit, x_loc, x_kappa = jnp.split(h_x[:, :coord_types], [Kx, 2*Kx], axis=-1) + x_logit -= jax.scipy.special.logsumexp(x_logit, axis=1)[:, None] + x_kappa = jax.nn.softplus(x_kappa) + h_x = jnp.concatenate([x_logit, x_loc, x_kappa, jnp.zeros((n, output_size - coord_types))], axis=-1) + return h_x + + @hk.transform + def network(G, XYZ, A, W, M, is_train): + ''' + Args: + G: scalar integer for space group id 1-230 + XYZ: (n, 3) fractional coordinates + A: (n, ) element type + W: (n, ) wyckoff position index + M: (n, ) multiplicities + is_train: bool + Returns: + h: (5n+1, output_types) + ''' + + assert (XYZ.ndim == 2 ) + assert (XYZ.shape[0] == A.shape[0]) + assert (XYZ.shape[1] == 3) + + n = XYZ.shape[0] + X, Y, Z = XYZ[:, 0], XYZ[:, 1], XYZ[:,2] + + w_max = wmax_table[G-1] + initializer = hk.initializers.TruncatedNormal(0.01) + + g_embeddings = hk.get_parameter('g_embeddings', [230, embed_size], init=initializer)[G-1] + w_embeddings = hk.get_parameter('w_embeddings', [wyck_types, embed_size], init=initializer)[W] + a_embeddings = hk.get_parameter('a_embeddings', [atom_types, embed_size], init=initializer)[A] + + if h0_size >0: + # compute w_logits depending on g + w_logit = hk.Sequential([hk.Linear(h0_size, w_init=initializer), + jax.nn.gelu, + hk.Linear(wyck_types, w_init=initializer)] + )(g_embeddings) + else: + # w_logit of the first atom is simply a table + w_params = hk.get_parameter('w_params', [230, wyck_types], init=initializer) + w_logit = w_params[G-1] + + # (1) the first atom should not be the pad atom + # (2) mask out unavaiable position for the given spacegroup + w_mask = jnp.logical_and(jnp.arange(wyck_types)>0, jnp.arange(wyck_types)<=w_max) + w_logit = jnp.where(w_mask, w_logit, w_logit-1e10) + # normalization + w_logit -= jax.scipy.special.logsumexp(w_logit) # (wyck_types, ) + + h0 = jnp.concatenate([w_logit[None, :], + jnp.zeros((1, output_size-wyck_types))], axis=-1) # (1, output_size) + if n == 0: return h0 + + mask = jnp.tril(jnp.ones((1, 5*n, 5*n))) # mask for the attention matrix + + hW = jnp.concatenate([g_embeddings[None, :].repeat(n, axis=0), # (n, embed_size) + w_embeddings, # (n, embed_size) + M.reshape(n, 1), # (n, 1) + ], axis=1) # (n, ...) + hW = hk.Linear(model_size, w_init=initializer)(hW) # (n, model_size) + + hA = jnp.concatenate([g_embeddings[None, :].repeat(n, axis=0), # (n, embed_size) + a_embeddings, # (n, embed_size) + ], axis=1) # (n, ...) + hA = hk.Linear(model_size, w_init=initializer)(hA) # (n, model_size) + + hX = jnp.concatenate([g_embeddings[None, :].repeat(n, axis=0), + ] + + [fn(2*jnp.pi*X[:, None]*f) for f in range(1, Nf+1) for fn in (jnp.sin, jnp.cos)] + , axis=1) # (n, ...) + hX = hk.Linear(model_size, w_init=initializer)(hX) # (n, model_size) + + hY = jnp.concatenate([g_embeddings[None, :].repeat(n, axis=0), + ] + + [fn(2*jnp.pi*Y[:, None]*f) for f in range(1, Nf+1) for fn in (jnp.sin, jnp.cos)] + , axis=1) # (n, ...) + hY = hk.Linear(model_size, w_init=initializer)(hY) # (n, model_size) + + hZ = jnp.concatenate([g_embeddings[None, :].repeat(n, axis=0), + ]+ + [fn(2*jnp.pi*Z[:, None]*f) for f in range(1, Nf+1) for fn in (jnp.sin, jnp.cos)] + , axis=1) # (n, ...) + hZ = hk.Linear(model_size, w_init=initializer)(hZ) # (n, model_size) + + # interleave the three matrices + h = jnp.concatenate([hW[:, None, :], + hA[:, None, :], + hX[:, None, :], + hY[:, None, :], + hZ[:, None, :] + ], axis=1) # (n, 5, model_size) + h = h.reshape(5*n, -1) # (5*n, model_size) + + positional_embeddings = hk.get_parameter( + 'positional_embeddings', [5*n_max, model_size], init=initializer) + h = h + positional_embeddings[:5*n, :] + + del hW + del hA + del hX + del hY + del hZ + + for _ in range(num_layers): + attn_block = MultiHeadAttention(num_heads=num_heads, + key_size=key_size, + model_size=model_size, + w_init =initializer, + dropout_rate =dropout_rate + ) + h_norm = _layer_norm(h) + h_attn = attn_block(h_norm, h_norm, h_norm, + mask=mask, is_train=is_train) + if is_train: + h_attn = hk.dropout(hk.next_rng_key(), dropout_rate, h_attn) + h = h + h_attn + + dense_block = hk.Sequential([hk.Linear(widening_factor * model_size, w_init=initializer), + jax.nn.gelu, + hk.Linear(model_size, w_init=initializer)] + ) + h_norm = _layer_norm(h) + h_dense = dense_block(h_norm) + if is_train: + h_dense = hk.dropout(hk.next_rng_key(), dropout_rate, h_dense) + h = h + h_dense + + h = _layer_norm(h) + h = hk.Linear(output_size, w_init=initializer)(h) # (5*n, output_size) + + h = h.reshape(n, 5, -1) + h_al, h_x, h_y, h_z, w_logit = h[:, 0, :], h[:, 1, :], h[:, 2, :], h[:, 3, :], h[:, 4, :] + + # handle coordinate related params + h_x = renormalize(h_x) + h_y = renormalize(h_y) + h_z = renormalize(h_z) + + # we now do all kinds of masks to a_logit and w_logit + + a_logit = h_al[:, :atom_types] + w_logit = w_logit[:, :wyck_types] + + # (1) impose the constrain that W_0 <= W_1 <= W_2 + # while for Wyckoff points with zero dof it is even stronger W_0 < W_1 + w_mask_less_equal = jnp.arange(1, wyck_types).reshape(1, wyck_types-1) < W[:, None] + w_mask_less = jnp.arange(1, wyck_types).reshape(1, wyck_types-1) <= W[:, None] + w_mask = jnp.where((dof0_table[G-1, W])[:, None], w_mask_less, w_mask_less_equal) # (n, wyck_types-1) + + w_mask = jnp.concatenate([jnp.zeros((n, 1)), w_mask], axis=1) # (n, wyck_types) + w_logit = w_logit - jnp.where(w_mask, 1e10, 0.0) + w_logit -= jax.scipy.special.logsumexp(w_logit, axis=1)[:, None] # normalization + + # (2) # enhance the probability of pad atoms if there is already a type 0 atom + w_mask = jnp.concatenate( + [ jnp.where(W==0, jnp.ones((n)), jnp.zeros((n))).reshape(n, 1), + jnp.zeros((n, wyck_types-1)) + ], axis = 1 ) # (n, wyck_types) mask = 1 for those locations to place pad atoms of type 0 + w_logit = w_logit + jnp.where(w_mask, 1e10, 0.0) + w_logit -= jax.scipy.special.logsumexp(w_logit, axis=1)[:, None] # normalization + + # (3) mask out unavaiable position after w_max for the given spacegroup + w_logit = jnp.where(jnp.arange(wyck_types)<=w_max, w_logit, w_logit-1e10) + w_logit -= jax.scipy.special.logsumexp(w_logit, axis=1)[:, None] # normalization + + # (4) if w !=0 the mask out the pad atom, otherwise mask out true atoms + a_mask = jnp.concatenate( + [(W>0).reshape(n, 1), + (W==0).reshape(n, 1).repeat(atom_types-1, axis=1) + ], axis = 1 ) # (n, atom_types) mask = 1 for those locations to be masked out + a_logit = a_logit + jnp.where(a_mask, -1e10, 0.0) + a_logit -= jax.scipy.special.logsumexp(a_logit, axis=1)[:, None] # normalization + + w_logit = jnp.concatenate([w_logit, + jnp.zeros((n, output_size - wyck_types)) + ], axis = -1) + + # now move on to lattice part + l_logit, mu, sigma = jnp.split(h_al[:, atom_types:atom_types+lattice_types], + [Kl, + Kl+Kl*6, + ], axis=-1) + + # normalization + l_logit -= jax.scipy.special.logsumexp(l_logit, axis=1)[:, None] + # ensure positivity + sigma = jax.nn.softplus(sigma) + sigmamin + + h_al = jnp.concatenate([a_logit, l_logit, mu, sigma, + jnp.zeros((n, output_size - atom_types - lattice_types)) + ], axis=-1) # (n, output_size) + + # finally assemble everything together + h = jnp.concatenate([h_al[:, None, :], + h_x[:, None, :], + h_y[:, None, :], + h_z[:, None, :], + w_logit[:, None, :] + ], axis=1) # (n, 5, output_size) + h = h.reshape(5*n, output_size) # (5*n, output_size) + + h = jnp.concatenate( [h0, h], axis = 0) # (5*n+1, output_size) + + return h + + + G = jnp.array(123) + XYZ = jnp.zeros((n_max, 3), dtype=int) + A = jnp.zeros((n_max, ), dtype=int) + W = jnp.zeros((n_max, ), dtype=int) + M = jnp.zeros((n_max, ), dtype=int) + + params = network.init(key, G, XYZ, A, W, M, True) + return params, network.apply + +def _layer_norm(x: jax.Array) -> jax.Array: + """Applies a unique LayerNorm to `x` with default settings.""" + ln = hk.LayerNorm(axis=-1, create_scale=True, create_offset=True) + return ln(x) diff --git a/crystalformerapp/src/utils.py b/crystalformerapp/src/utils.py new file mode 100644 index 0000000..8b1e03d --- /dev/null +++ b/crystalformerapp/src/utils.py @@ -0,0 +1,236 @@ +import jax +import jax.numpy as jnp +import numpy as np +import pandas as pd +from pyxtal import pyxtal +from pymatgen.core import Structure, Lattice +from pymatgen.symmetry.analyzer import SpacegroupAnalyzer +from functools import partial +import multiprocessing +import os + +from crystalformerapp.src.wyckoff import mult_table +from crystalformerapp.src.elements import element_list + +@jax.vmap +def sort_atoms(W, A, X): + """ + lex sort atoms according W, X, Y, Z + + W: (n, ) + A: (n, ) + X: (n, dim) int + """ + W_temp = jnp.where(W>0, W, 9999) # change 0 to 9999 so they remain in the end after sort + + X -= jnp.floor(X) + idx = jnp.lexsort((X[:,2], X[:,1], X[:,0], W_temp)) + + #assert jnp.allclose(W, W[idx]) + A = A[idx] + X = X[idx] + return A, X + +def letter_to_number(letter): + """ + 'a' to 1 , 'b' to 2 , 'z' to 26, and 'A' to 27 + """ + return ord(letter) - ord('a') + 1 if 'a' <= letter <= 'z' else 27 if letter == 'A' else None + +def shuffle(key, data): + """ + shuffle data along batch dimension + """ + G, L, XYZ, A, W = data + idx = jax.random.permutation(key, jnp.arange(len(L))) + return G[idx], L[idx], XYZ[idx], A[idx], W[idx] + +def process_one(cif, atom_types, wyck_types, n_max, tol=0.01): + """ + # taken from https://anonymous.4open.science/r/DiffCSP-PP-8F0D/diffcsp/common/data_utils.py + Process one cif string to get G, L, XYZ, A, W + + Args: + cif: cif string + atom_types: number of atom types + wyck_types: number of wyckoff types + n_max: maximum number of atoms in the unit cell + tol: tolerance for pyxtal + + Returns: + G: space group number + L: lattice parameters + XYZ: fractional coordinates + A: atom types + W: wyckoff letters + """ + crystal = Structure.from_str(cif, fmt='cif') + spga = SpacegroupAnalyzer(crystal, symprec=tol) + crystal = spga.get_refined_structure() + c = pyxtal() + try: + c.from_seed(crystal, tol=0.01) + except: + c.from_seed(crystal, tol=0.0001) + + g = c.group.number + num_sites = len(c.atom_sites) + assert (n_max > num_sites) # we will need at least one empty site for output of L params + + print (g, c.group.symbol, num_sites) + natoms = 0 + ww = [] + aa = [] + fc = [] + ws = [] + for site in c.atom_sites: + a = element_list.index(site.specie) + x = site.position + m = site.wp.multiplicity + w = letter_to_number(site.wp.letter) + symbol = str(m) + site.wp.letter + natoms += site.wp.multiplicity + assert (a < atom_types) + assert (w < wyck_types) + assert (np.allclose(x, site.wp[0].operate(x))) + aa.append( a ) + ww.append( w ) + fc.append( x ) # the generator of the orbit + ws.append( symbol ) + print ('g, a, w, m, symbol, x:', g, a, w, m, symbol, x) + idx = np.argsort(ww) + ww = np.array(ww)[idx] + aa = np.array(aa)[idx] + fc = np.array(fc)[idx].reshape(num_sites, 3) + ws = np.array(ws)[idx] + print (ws, aa, ww, natoms) + + aa = np.concatenate([aa, + np.full((n_max - num_sites, ), 0)], + axis=0) + + ww = np.concatenate([ww, + np.full((n_max - num_sites, ), 0)], + axis=0) + fc = np.concatenate([fc, + np.full((n_max - num_sites, 3), 1e10)], + axis=0) + + abc = np.array([c.lattice.a, c.lattice.b, c.lattice.c])/natoms**(1./3.) + angles = np.array([c.lattice.alpha, c.lattice.beta, c.lattice.gamma]) + l = np.concatenate([abc, angles]) + + print ('===================================') + + return g, l, fc, aa, ww + +def GLXYZAW_from_file(csv_file, atom_types, wyck_types, n_max, num_workers=1): + """ + Read cif strings from csv file and convert them to G, L, XYZ, A, W + Note that cif strings must be in the column 'cif' + + Args: + csv_file: csv file containing cif strings + atom_types: number of atom types + wyck_types: number of wyckoff types + n_max: maximum number of atoms in the unit cell + num_workers: number of workers for multiprocessing + + Returns: + G: space group number + L: lattice parameters + XYZ: fractional coordinates + A: atom types + W: wyckoff letters + """ + data = pd.read_csv(csv_file) + cif_strings = data['cif'] + + p = multiprocessing.Pool(num_workers) + partial_process_one = partial(process_one, atom_types=atom_types, wyck_types=wyck_types, n_max=n_max) + results = p.map_async(partial_process_one, cif_strings).get() + p.close() + p.join() + + G, L, XYZ, A, W = zip(*results) + + G = jnp.array(G) + A = jnp.array(A).reshape(-1, n_max) + W = jnp.array(W).reshape(-1, n_max) + XYZ = jnp.array(XYZ).reshape(-1, n_max, 3) + L = jnp.array(L).reshape(-1, 6) + + A, XYZ = sort_atoms(W, A, XYZ) + + return G, L, XYZ, A, W + +def GLXA_to_structure_single(G, L, X, A): + """ + Convert G, L, X, A to pymatgen structure. Do not use this function due to the bug in pymatgen. + + Args: + G: space group number + L: lattice parameters + X: fractional coordinates + A: atom types + + Returns: + structure: pymatgen structure + """ + lattice = Lattice.from_parameters(*L) + # filter out padding atoms + idx = np.where(A > 0) + A = A[idx] + X = X[idx] + structure = Structure.from_spacegroup(sg=G, lattice=lattice, species=A, coords=X).as_dict() + + return structure + +def GLXA_to_csv(G, L, X, A, num_worker=1, filename='out_structure.csv'): + + L = np.array(L) + X = np.array(X) + A = np.array(A) + p = multiprocessing.Pool(num_worker) + if isinstance(G, int): + G = np.array([G] * len(L)) + structures = p.starmap_async(GLXA_to_structure_single, zip(G, L, X, A)).get() + p.close() + p.join() + + data = pd.DataFrame() + data['cif'] = structures + header = False if os.path.exists(filename) else True + data.to_csv(filename, mode='a', index=False, header=header) + + +if __name__=='__main__': + atom_types = 119 + wyck_types = 28 + n_max = 24 + + import numpy as np + np.set_printoptions(threshold=np.inf) + + #csv_file = '../data/mini.csv' + #csv_file = '/home/wanglei/cdvae/data/carbon_24/val.csv' + #csv_file = '/home/wanglei/cdvae/data/perov_5/val.csv' + csv_file = '/home/wanglei/cdvae/data/mp_20/train.csv' + + G, L, XYZ, A, W = GLXYZAW_from_file(csv_file, atom_types, wyck_types, n_max) + + print (G.shape) + print (L.shape) + print (XYZ.shape) + print (A.shape) + print (W.shape) + + print ('L:\n',L) + print ('XYZ:\n',XYZ) + + + @jax.vmap + def lookup(G, W): + return mult_table[G-1, W] # (n_max, ) + M = lookup(G, W) # (batchsize, n_max) + print ('N:\n', M.sum(axis=-1)) diff --git a/crystalformerapp/src/von_mises.py b/crystalformerapp/src/von_mises.py new file mode 100644 index 0000000..8d45b96 --- /dev/null +++ b/crystalformerapp/src/von_mises.py @@ -0,0 +1,113 @@ +# https://github.com/pyro-ppl/numpyro/blob/master/numpyro/distributions/util.py +# Copyright Contributors to the Pyro project. +# SPDX-License-Identifier: Apache-2.0 + +import jax +from jax import jit, lax, random +import jax.numpy as jnp +from functools import partial + +def sample_von_mises(key, loc, concentration, shape): + """Generate sample from von Mises distribution + + :param key: random number generator key + :param sample_shape: shape of samples + :return: samples from von Mises + """ + samples = von_mises_centered( + key, concentration, shape + ) + samples = samples + loc # VM(0, concentration) -> VM(loc,concentration) + samples = (samples + jnp.pi) % (2.0 * jnp.pi) - jnp.pi + + return samples + +def von_mises_centered(key, concentration, shape, dtype=jnp.float64): + """Compute centered von Mises samples using rejection sampling from [1] with wrapped Cauchy proposal. + *** References *** + [1] Luc Devroye "Non-Uniform Random Variate Generation", Springer-Verlag, 1986; + Chapter 9, p. 473-476. http://www.nrbook.com/devroye/Devroye_files/chapter_nine.pdf + :param key: random number generator key + :param concentration: concentration of distribution + :param shape: shape of samples + :param dtype: float precesions for choosing correct s cutfoff + :return: centered samples from von Mises + """ + shape = shape or jnp.shape(concentration) + dtype = jnp.result_type(dtype) + concentration = lax.convert_element_type(concentration, dtype) + concentration = jnp.broadcast_to(concentration, shape) + return _von_mises_centered(key, concentration, shape, dtype) + + +@partial(jit, static_argnums=(2, 3)) +def _von_mises_centered(key, concentration, shape, dtype): + # Cutoff from TensorFlow probability + # (https://github.com/tensorflow/probability/blob/f051e03dd3cc847d31061803c2b31c564562a993/tensorflow_probability/python/distributions/von_mises.py#L567-L570) + s_cutoff_map = { + jnp.dtype(jnp.float16): 1.8e-1, + jnp.dtype(jnp.float32): 2e-2, + jnp.dtype(jnp.float64): 1.2e-4, + } + s_cutoff = s_cutoff_map.get(dtype) + + r = 1.0 + jnp.sqrt(1.0 + 4.0 * concentration**2) + rho = (r - jnp.sqrt(2.0 * r)) / (2.0 * concentration) + s_exact = (1.0 + rho**2) / (2.0 * rho) + + s_approximate = 1.0 / concentration + + s = jnp.where(concentration > s_cutoff, s_exact, s_approximate) + + def cond_fn(*args): + """check if all are done or reached max number of iterations""" + i, _, done, _, _ = args[0] + return jnp.bitwise_and(i < 100, jnp.logical_not(jnp.all(done))) + + def body_fn(*args): + i, key, done, _, w = args[0] + uni_ukey, uni_vkey, key = random.split(key, 3) + + u = random.uniform( + key=uni_ukey, + shape=shape, + dtype=concentration.dtype, + minval=-1.0, + maxval=1.0, + ) + z = jnp.cos(jnp.pi * u) + w = jnp.where(done, w, (1.0 + s * z) / (s + z)) # Update where not done + + y = concentration * (s - w) + v = random.uniform(key=uni_vkey, shape=shape, dtype=concentration.dtype) + + accept = (y * (2.0 - y) >= v) | (jnp.log(y / v) + 1.0 >= y) + + return i + 1, key, accept | done, u, w + + init_done = jnp.zeros(shape, dtype=bool) + init_u = jnp.zeros(shape) + init_w = jnp.zeros(shape) + + _, _, done, u, w = lax.while_loop( + cond_fun=cond_fn, + body_fun=body_fn, + init_val=(jnp.array(0), key, init_done, init_u, init_w), + ) + + return jnp.sign(u) * jnp.arccos(w) + +def von_mises_logpdf(x, loc, concentration): + ''' + kappa is the concentration. kappa = 0 means uniform distribution + ''' + return -(jnp.log(2 * jnp.pi) + jnp.log(jax.scipy.special.i0e(concentration)) + ) + concentration * (jnp.cos((x - loc) % (2 * jnp.pi)) - 1) + +if __name__=='__main__': + key = jax.random.PRNGKey(42) + loc = jnp.array([-1.0, 1.0, 0.0]) + kappa = jnp.array([10.0, 10.0, 100.0]) + x = sample_von_mises(key, loc, kappa, (3, )) + print (x) + diff --git a/crystalformerapp/src/wyckoff.py b/crystalformerapp/src/wyckoff.py new file mode 100644 index 0000000..0716e07 --- /dev/null +++ b/crystalformerapp/src/wyckoff.py @@ -0,0 +1,179 @@ +import pandas as pd +import os +import numpy as np +import re +import jax +import jax.numpy as jnp + +def from_xyz_str(xyz_str: str): + """ + Args: + xyz_str: string of the form 'x, y, z', '-x, -y, z', '-2y+1/2, 3x+1/2, z-y+1/2', etc. + Returns: + affine operator as a 3x4 array + """ + rot_matrix = np.zeros((3, 3)) + trans = np.zeros(3) + tokens = xyz_str.strip().replace(" ", "").lower().split(",") + re_rot = re.compile(r"([+-]?)([\d\.]*)/?([\d\.]*)([x-z])") + re_trans = re.compile(r"([+-]?)([\d\.]+)/?([\d\.]*)(?![x-z])") + for i, tok in enumerate(tokens): + # build the rotation matrix + for m in re_rot.finditer(tok): + factor = -1.0 if m.group(1) == "-" else 1.0 + if m.group(2) != "": + factor *= float(m.group(2)) / float(m.group(3)) if m.group(3) != "" else float(m.group(2)) + j = ord(m.group(4)) - 120 + rot_matrix[i, j] = factor + # build the translation vector + for m in re_trans.finditer(tok): + factor = -1 if m.group(1) == "-" else 1 + num = float(m.group(2)) / float(m.group(3)) if m.group(3) != "" else float(m.group(2)) + trans[i] = num * factor + return np.concatenate( [rot_matrix, trans[:, None]], axis=1) # (3, 4) + + +current_dir = os.path.dirname(__file__) +data_dir = os.path.abspath(os.path.join(current_dir, '../data')) +file_path = os.path.join(data_dir, 'wyckoff_list.csv') +df = pd.read_csv(file_path) + +df['Wyckoff Positions'] = df['Wyckoff Positions'].apply(eval) # convert string to list +wyckoff_positions = df['Wyckoff Positions'].tolist() + +symops = np.zeros((230, 28, 576, 3, 4)) # 576 is the least common multiple for all possible mult +mult_table = np.zeros((230, 28), dtype=int) # mult_table[g-1, w] = multiplicity , 28 because we had pad 0 +wmax_table = np.zeros((230,), dtype=int) # wmax_table[g-1] = number of possible wyckoff letters for g +dof0_table = np.ones((230, 28), dtype=bool) # dof0_table[g-1, w] = True for those wyckoff points with dof = 0 (no continuous dof) +fc_mask_table = np.zeros((230, 28, 3), dtype=bool) # fc_mask_table[g-1, w] = True for continuous fc + +def build_g_code(): + #use general wyckoff position as the code for space groups + xyz_table = [] + g_table = [] + for g in range(230): + wp0 = wyckoff_positions[g][0] + g_table.append([]) + for xyz in wp0: + if xyz not in xyz_table: + xyz_table.append(xyz) + g_table[-1].append(xyz_table.index(xyz)) + assert len(g_table[-1]) == len(set(g_table[-1])) + + g_code = [] + for g in range(230): + g_code.append( [1 if i in g_table[g] else 0 for i in range(len(xyz_table))] ) + del xyz_table + del g_table + g_code = jnp.array(g_code) + return g_code + +for g in range(230): + wyckoffs = [] + for x in wyckoff_positions[g]: + wyckoffs.append([]) + for y in x: + wyckoffs[-1].append(from_xyz_str(y)) + wyckoffs = wyckoffs[::-1] # a-z,A + + mult = [len(w) for w in wyckoffs] + mult_table[g, 1:len(mult)+1] = mult + wmax_table[g] = len(mult) + + # print (g+1, [len(w) for w in wyckoffs]) + for w, wyckoff in enumerate(wyckoffs): + wyckoff = np.array(wyckoff) + repeats = symops.shape[2] // wyckoff.shape[0] + symops[g, w+1, :, :, :] = np.tile(wyckoff, (repeats, 1, 1)) + dof0_table[g, w+1] = np.linalg.matrix_rank(wyckoff[0, :3, :3]) == 0 + fc_mask_table[g, w+1] = jnp.abs(wyckoff[0, :3, :3]).sum(axis=1)!=0 + +symops = jnp.array(symops) +mult_table = jnp.array(mult_table) +wmax_table = jnp.array(wmax_table) +dof0_table = jnp.array(dof0_table) +fc_mask_table = jnp.array(fc_mask_table) + +def symmetrize_atoms(g, w, x): + ''' + symmetrize atoms via, apply all sg symmetry op, finding the generator, and lastly apply symops + we need to do that because the sampled atom might not be at the first WP + Args: + g: int + w: int + x: (3,) + Returns: + xs: (m, 3) symmetrize atom positions + ''' + + # (1) apply all space group symmetry op to the x + w_max = wmax_table[g-1].item() + m_max = mult_table[g-1, w_max].item() + ops = symops[g-1, w_max, :m_max] # (m_max, 3, 4) + affine_point = jnp.array([*x, 1]) # (4, ) + coords = ops@affine_point # (m_max, 3) + coords -= jnp.floor(coords) + + # (2) search for the generator which satisfies op0(x) = x , i.e. the first Wyckoff position + # here we solve it in a jit friendly way by looking for the minimal distance solution for the lhs and rhs + #https://github.com/qzhu2017/PyXtal/blob/82e7d0eac1965c2713179eeda26a60cace06afc8/pyxtal/wyckoff_site.py#L115 + def dist_to_op0x(coord): + diff = jnp.dot(symops[g-1, w, 0], jnp.array([*coord, 1])) - coord + diff -= jnp.rint(diff) + return jnp.sum(diff**2) + loc = jnp.argmin(jax.vmap(dist_to_op0x)(coords)) + x = coords[loc].reshape(3,) + + # (3) lastly, apply the given symmetry op to x + m = mult_table[g-1, w] + ops = symops[g-1, w, :m] # (m, 3, 4) + affine_point = jnp.array([*x, 1]) # (4, ) + xs = ops@affine_point # (m, 3) + xs -= jnp.floor(xs) # wrap back to 0-1 + return xs + +if __name__=='__main__': + print (symops.shape) + print (symops.size*symops.dtype.itemsize//(1024*1024)) + + import numpy as np + np.set_printoptions(threshold=np.inf) + + print (symops[166-1,3, :6]) + op = symops[166-1, 3, 0] + print (op) + + w_max = wmax_table[225-1] + m_max = mult_table[225-1, w_max] + print ('w_max, m_max', w_max, m_max) + + print (fc_mask_table[225-1, 6]) + sys.exit(0) + + print ('mult_table') + print (mult_table[25-1]) # space group id -> multiplicity table + print (mult_table[42-1]) + print (mult_table[47-1]) + print (mult_table[99-1]) + print (mult_table[123-1]) + print (mult_table[221-1]) + print (mult_table[166-1]) + + print ('dof0_table') + print (dof0_table[25-1]) + print (dof0_table[42-1]) + print (dof0_table[47-1]) + print (dof0_table[225-1]) + print (dof0_table[166-1]) + + print ('wmax_table') + print (wmax_table[47-1]) + print (wmax_table[123-1]) + print (wmax_table[166-1]) + + print ('wmax_table', wmax_table) + + atom_types = 119 + aw_max = wmax_table*(atom_types-1) # the maximum value of aw + print ( (aw_max-1)%(atom_types-1)+1 ) # = 118 + print ( (aw_max-1)//(atom_types-1)+1 ) # = wmax diff --git a/crystalformerapp/tests/config.py b/crystalformerapp/tests/config.py new file mode 100644 index 0000000..408acbe --- /dev/null +++ b/crystalformerapp/tests/config.py @@ -0,0 +1,22 @@ +import os, sys +testdir = os.path.dirname(os.path.abspath(__file__)) +rootdir = os.path.dirname(testdir) +datadir = os.path.join(rootdir, "data") +sys.path.append(os.path.join(testdir, "../src")) + +import jax +import jax.numpy as jnp +import numpy as np +import haiku as hk +from jax.lib import xla_bridge +# Check if GPU is available +try: + if xla_bridge.get_backend().platform == 'gpu': + print("GPU is available. Using GPU.") + else: + raise RuntimeError("No GPU available, switching to CPU.") +except RuntimeError as e: + print(e) + os.environ["JAX_PLATFORMS"] = "cpu" + jax.config.update("jax_platform_name", "cpu") + print("Changed platform to CPU.") \ No newline at end of file diff --git a/tests/test_fc_mask.py b/crystalformerapp/tests/test_fc_mask.py similarity index 100% rename from tests/test_fc_mask.py rename to crystalformerapp/tests/test_fc_mask.py diff --git a/tests/test_lattice.py b/crystalformerapp/tests/test_lattice.py similarity index 100% rename from tests/test_lattice.py rename to crystalformerapp/tests/test_lattice.py diff --git a/tests/test_sampling.py b/crystalformerapp/tests/test_sampling.py similarity index 100% rename from tests/test_sampling.py rename to crystalformerapp/tests/test_sampling.py diff --git a/tests/test_transformer.py b/crystalformerapp/tests/test_transformer.py similarity index 100% rename from tests/test_transformer.py rename to crystalformerapp/tests/test_transformer.py diff --git a/tests/test_utils.py b/crystalformerapp/tests/test_utils.py similarity index 100% rename from tests/test_utils.py rename to crystalformerapp/tests/test_utils.py diff --git a/tests/test_wyckoff.py b/crystalformerapp/tests/test_wyckoff.py similarity index 100% rename from tests/test_wyckoff.py rename to crystalformerapp/tests/test_wyckoff.py diff --git a/imgs/crystalformer.png b/imgs/crystalformer.png deleted file mode 100644 index 3c5a2a9..0000000 Binary files a/imgs/crystalformer.png and /dev/null differ diff --git a/requirements.txt b/requirements.txt index 18bc1cb..fbf33a5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,6 @@ pymatgen==2024.3.1 pyxtal==0.6.3 SMACT==2.5.5 matbench-genmetrics==0.6.1 -matminer @ git+https://github.com/hackingmaterials/matminer.git \ No newline at end of file +matminer @ git+https://github.com/hackingmaterials/matminer.git +gdown +weas-widget \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..4ebc5c3 --- /dev/null +++ b/setup.py @@ -0,0 +1,31 @@ +from setuptools import setup, find_packages + + +with open('requirements.txt') as f: + required = f.read().splitlines() + +setup( + name="crystalformerapp", + version="0.1", + packages=find_packages(), + install_requires=required, + include_package_data=True, + package_data={ + '': ['data/*', 'model/*'], + }, + entry_points={ + 'console_scripts': [ + 'crystalgpt-app=crystalformerapp.gr_frontend:main' + ] + }, + author="Schrodinger's Cat", + author_email="gmy721212@163.com", + description="CrystalFormer APP", + keywords="Crystal Generation", + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], +) + diff --git a/tests/config.py b/tests/config.py deleted file mode 100644 index 606e34e..0000000 --- a/tests/config.py +++ /dev/null @@ -1,10 +0,0 @@ -import os, sys -testdir = os.path.dirname(os.path.abspath(__file__)) -rootdir = os.path.dirname(testdir) -datadir = os.path.join(rootdir, "data") -sys.path.append(os.path.join(testdir, "../src")) - -import jax -import jax.numpy as jnp -import numpy as np -import haiku as hk