From 50f5eeac06f8f3aae2dbc62e9d96b942b50c8228 Mon Sep 17 00:00:00 2001 From: Zehua Zeng Date: Wed, 5 Aug 2026 23:06:52 -0700 Subject: [PATCH] Six domains matverse had the machinery for and did not reach MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Working through a list of what a materials library was not covering. Each of these is a formula over quantities matverse already produced; what was missing was the step that reads them off. Batteries. mv.thermo.voltage is the hull slope along the working-ion axis, and mv.thermo.theoretical_capacity is the same question asked of one structure rather than two — an electron count from oxidation states, which is what a screen wants first and much more cheaply. LiFePO4 comes out at 3.497 V and 169.9 mAh/g against a measured plateau of 3.4-3.5 V and 170; NaFePO4 gives 154.2 for sodium against about 154, and zero for lithium, which is the right answer to the wrong question. The gap was a classification, not an oversight. The coverage map exempted the whole 'apps' package as "pymatgen's own applications (borg, battery)", and that one sentence put a directory-crawling data assimilator and a thermodynamic calculation under the same verdict. Splitting it moved six modules into scope. classify now matches a full module name as well as a top-level package, because a package can hold unlike things and exempting it exempts all of them. Scattering. mv.prop.scattering applies the two transforms an amorphous structure needs before it can be compared with a measurement of one: S(q) and G(r). Both are definitions, so both are checkable — an ideal gas returns S(q) = 1.000000 everywhere, and a hard-sphere step reproduces its closed form. The residual error is quadrature on whatever r grid mv.prop.rdf produced and falls linearly with its step, 0.24 to 0.012 as the step goes 0.10 to 0.005. Applying this to a crystal produces termination ripple larger than any real peak, and the notes say so and point at mv.prop.xrd. Superconductivity. mv.prop.superconductivity computes omega_log from the phonon density of states and applies Allen-Dynes with the f1 and f2 strong-coupling factors. It will not guess lambda: that is an integral over alpha^2 F and needs EPW, and a guessed one produces a temperature that reads as a prediction. The substitution of the phonon density of states for alpha^2 F is recorded, because it assumes the coupling does not depend on frequency and that is wrong wherever one branch dominates. Catalysis. mv.surf.scaling fits the linear relation between two adsorbates and mv.surf.volcano ranks surfaces against a Sabatier optimum. The residual is the column worth reading rather than the fit — a catalyst that beats the scaling ceiling has to break the relation. The optimum is an input and says so. Thermoelectrics. mv.prop.zt needs a relaxation time the constant relaxation time approximation exists in order not to supply, so it is required with no default. But zt_ceiling needs none: tau appears in sigma and again in the electronic thermal conductivity, and cancels. Checked across five decades of conductivity, zT climbs 0.027, 0.24, 1.03, 1.55 and settles at 1.6384 against an analytic 1.6393. A material whose Seebeck coefficient puts its ceiling below the zT you need cannot be rescued by any conductivity, and that survives not knowing tau. Three of these refuse a default — lambda, tau, and the reference metal energy — for the same reason, and it is worth stating once: a guessed input here does not produce a wrong number, it produces a number that reads as a prediction. What was deliberately not built is now written down. OUT_OF_SCOPE records five domains with the reason each is a boundary rather than a backlog: dislocations and plasticity, grain boundaries and texture, radiation damage, continuum mechanics, and training interatomic potentials. A coverage figure computed over one library's modules says nothing about the fields this library does not enter either, and somebody deciding whether matverse fits their problem needs the second list more than the first. Ring statistics is on the amorphous list and is not here. King, Guttman and primitive rings give different distributions from the same structure, and shipping a number under an ambiguous definition is the failure mode the rest of this commit is written to avoid. One bug found by the contract probe: theoretical_capacity declared its columns with an {ion} placeholder while the parameter is called working_ion, so nothing expanded and all four claims read as unfulfilled. The verified rate fell to 99.4% and named them. 1012 tests pass on py3.12, 892 on py3.10. Contract-verified rate back to 165/165, all 16 notebooks execute with their printed numbers matching the prose, docs build. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_016wh5NzNE9Wn49nuUm7zg2a --- matverse/_coverage.py | 71 +- matverse/prop.py | 360 ++++++ matverse/surf.py | 166 +++ matverse/thermo.py | 310 +++++ .../docs/_scripts/nb_beyond_one_number.py | 200 ++++ matverse_guide/docs/_scripts/nb_dynamics.py | 49 + matverse_guide/docs/api/user.md | 16 +- .../docs/tutorials/beyond_one_number.ipynb | 1007 ++++++++++++----- .../docs/tutorials/chemical_space.ipynb | 326 +++--- matverse_guide/docs/tutorials/data_io.ipynb | 276 ++--- .../tutorials/defects_and_diffusion.ipynb | 402 +++---- matverse_guide/docs/tutorials/disorder.ipynb | 224 ++-- matverse_guide/docs/tutorials/dynamics.ipynb | 371 +++--- .../docs/tutorials/from_pymatgen.ipynb | 246 ++-- .../docs/tutorials/getting_started.ipynb | 438 +++---- .../docs/tutorials/infrastructure.ipynb | 314 ++--- .../docs/tutorials/interfaces.ipynb | 178 +-- .../docs/tutorials/magnetic_ordering.ipynb | 190 ++-- .../docs/tutorials/models_and_campaigns.ipynb | 302 ++--- matverse_guide/docs/tutorials/molecules.ipynb | 284 ++--- matverse_guide/docs/tutorials/screening.ipynb | 350 +++--- .../docs/tutorials/structure_and_bands.ipynb | 384 +++---- .../tutorials/surfaces_and_adsorption.ipynb | 254 ++--- tests/_contract_cases.py | 64 ++ tests/test_physics.py | 403 +++++++ 25 files changed, 4644 insertions(+), 2541 deletions(-) diff --git a/matverse/_coverage.py b/matverse/_coverage.py index ce1014a..3657e62 100644 --- a/matverse/_coverage.py +++ b/matverse/_coverage.py @@ -48,6 +48,9 @@ #: pymatgen module -> the matverse functions that reach it. WRAPPED: Dict[str, List[str]] = { "analysis.adsorption": ["mv.surf.adsorption_sites"], + "apps.battery.insertion_battery": ["mv.thermo.voltage"], + "apps.battery.battery_abc": ["mv.thermo.voltage"], + "apps.battery.analyzer": ["mv.thermo.theoretical_capacity"], "analysis.bond_valence": ["mv.transform.oxidation_states"], "analysis.chemenv.coordination_environments.chemenv_strategies": ["mv.env.chemenv"], @@ -195,7 +198,15 @@ #: Modules matverse reaches through an object another module handed it, rather #: than by importing them. The capability is used; the import is not there to #: find, so the direct-import check is told why rather than weakened. +#: Modules reached only through another one matverse calls directly. This dict +#: records *why* a module is covered without being called; ``classify`` does +#: not read it, so every entry here must also appear in ``WRAPPED`` or it will +#: fall through to TODO. That is not obvious from the name and cost an +#: afternoon to rediscover. TRANSITIVE: Dict[str, str] = { + "apps.battery.battery_abc": + "the abstract base InsertionElectrode inherits from; reached through " + "mv.thermo.voltage and never constructed directly", "analysis.interfaces.zsl": "SubstrateAnalyzer, which mv.iface.match imports, runs the " "Zur-McGill lattice search out of this module", @@ -453,7 +464,18 @@ def equivalents(module: str) -> frozenset: # ------------------------------------------------------------- NOT_A_GOAL NOT_A_GOAL: Dict[str, str] = { "cli": "pymatgen's command line, not a library capability", - "apps": "pymatgen's own applications (borg, battery)", + "apps.borg.hive": + "a directory-crawling data assimilator — an application, not a " + "library capability. mv.data and mv.dft.read_outputs are how matverse " + "gets data off disk", + "apps.borg.queen": "see apps.borg.hive", + "apps.battery.conversion_battery": + "conversion electrodes, where the framework is consumed rather than " + "intercalated into, so the reaction is a decomposition and not a " + "hull slope along one composition axis. mv.thermo.voltage is " + "specifically an intercalation voltage and says so; a conversion " + "electrode needs mv.thermo.reaction and a phase diagram, and calling " + "them the same thing would be the error this map exists to prevent", "command_line": "shells out to external binaries pymatgen wraps", "vis": "3D visualisation; mv.pl.structure covers the quick look and " "VESTA and Crystal Toolkit cover real inspection", @@ -735,7 +757,10 @@ def classify(module: str, alias_map: Dict[str, str] | None = None) -> str: alias_map = aliases() if alias_map is None else alias_map module = canonical(module, alias_map) top = module.split(".")[0] - if top in NOT_A_GOAL: + # Both the whole package and a single module, because a package can hold + # unlike things: apps.borg is an application and apps.battery is a + # thermodynamic calculation, and exempting the package exempted both. + if top in NOT_A_GOAL or module in NOT_A_GOAL: return "NOT_A_GOAL" if module in INTERNAL or any(m in module for m in INTERNAL_MARKERS): return "INTERNAL" @@ -800,7 +825,49 @@ def summary(root: str | None = None) -> str: return "\n".join(lines) +#: Domains matverse does not cover, and will not. These are not pymatgen +#: modules and so never appear in the count above — which is exactly why they +#: are written here. A coverage figure computed over one library's modules says +#: nothing about the fields that library does not enter either, and a reader +#: deciding whether matverse fits their problem needs the second list more than +#: the first. +#: +#: The test suite does not enforce anything here. It is a record of decisions, +#: kept so that "matverse has no dislocations" reads as a boundary somebody +#: drew rather than as something nobody got round to. +OUT_OF_SCOPE: Dict[str, str] = { + "dislocations and plasticity": + "a dislocation is a line defect whose behaviour lives in the " + "interaction between many of them, at micrometres and above. The " + "periodic cell matverse is built on is the wrong object: one " + "dislocation in a supercell interacts with its own images and that " + "interaction is the answer. atomman and LAMMPS are where this lives", + "grain boundaries and polycrystal texture": + "mv.iface matches two lattices across an interface, which is the " + "atomistic half. A grain boundary energy landscape needs sampling " + "over misorientation and translation, and a texture is a " + "distribution over thousands of grains — a mesoscale problem with " + "mesoscale tools (DREAM.3D, MTEX, phase field)", + "radiation damage": + "a displacement cascade is a nanosecond of a hundred thousand atoms " + "far from equilibrium. mv.md.run drives ASE, which is the wrong " + "engine for that by two orders of magnitude; LAMMPS with a " + "hard-sphere-corrected potential is the usual one", + "continuum and finite element": + "matverse computes the elastic tensor a finite element model takes " + "as input, and stops there. What happens to a part under load is a " + "different discipline with its own libraries", + "training and fine-tuning interatomic potentials": + "mv.calc can reach twelve potentials and train none of them. That is " + "a deliberate line: training is a different workflow with different " + "data, different hardware and different failure modes, and the " + "libraries that do it — mace-torch, matgl, nequip — are the ones " + "matverse then loads the result from. mv.calc.register_calculator is " + "how a potential trained elsewhere becomes a level of theory here", +} + __all__ = ["WRAPPED", "NATIVE", "NOT_A_GOAL", "INTERNAL", "BLOCKED", + "OUT_OF_SCOPE", "EQUIVALENT", "TRANSITIVE", "equivalents", "public_modules", diff --git a/matverse/prop.py b/matverse/prop.py index a4a177e..e56a0df 100644 --- a/matverse/prop.py +++ b/matverse/prop.py @@ -2858,3 +2858,363 @@ def _stabilisation(grid: np.ndarray, counts: np.ndarray): if bool(clean[np.argmax(known)]): return np.nan, "already stable at the lowest temperature scanned" return float(grid[clean][0]), "stabilised within the scanned range" + + +@register_function( + aliases=["structure factor", "scattering", "S(q)", "pair distribution " + "function", "PDF", "total scattering", "reduced pair " + "distribution", "what a diffractometer sees"], + category="prop", + description="The two standard transforms of the pair correlation — the " + "structure factor S(q) and the reduced pair distribution " + "function G(r) — from a radial distribution already computed.", + requires={"obsm": ["{quantity}_{level}"], "uns": ["grids"], + "structures": ["{source}"]}, + produces={"obsm": ["structure_factor_{level}", "pdf_{level}"], + "uns": ["grids", "scattering"]}, + prerequisites=["mv.prop.rdf"], + examples=["mv.prop.scattering(md, level='calc')", + "mv.prop.scattering(md, level='emt', quantity='rdf_md', " + "q_max=20.0)"], + related=["mv.prop.rdf", "mv.md.rdf", "mv.md.melt_quench", + "mv.exp.attach", "mv.prop.compare_grids"], + notes="mv.md.melt_quench can build an amorphous structure and mv.prop.rdf " + "can describe it, but g(r) is not what a total-scattering " + "experiment reports. S(q) is, and G(r) is what a measured pattern " + "is usually Fourier-transformed into — so without these an " + "amorphous structure could be made here and never compared with a " + "measurement of one.\\n\\n" + "Both are definitions rather than models:\\n\\n" + " S(q) = 1 + (4 pi rho / q) * INT r [g(r) - 1] sin(qr) dr\\n" + " G(r) = 4 pi r rho [g(r) - 1]\\n\\n" + "which makes them checkable rather than merely plausible. For an " + "ideal gas, g = 1 everywhere and S(q) comes back as 1.000000 at " + "every q. For a hard-sphere exclusion, where g is zero below a " + "diameter and one above, the transform has a closed form and this " + "reproduces it to 7e-3.\\n\\n" + "Two honest limits, and mv.prop.rdf controls both.\\n\\n" + "**Truncation.** g(r) is only known out to r_max, and the Fourier " + "transform of a truncated function rings: the oscillations below " + "roughly 2 pi / r_max are termination ripple, not structure. A " + "window function would hide them, which is why there is not one. " + "This bites hardest on a **crystal**, whose g(r) never decays to " + "one — on the four textbook structures in mv.datasets the ripple is " + "larger than any real peak, and S(q) from a crystal computed this " + "way should not be read as a diffraction pattern. mv.prop.xrd is " + "the function for that. Total scattering is a technique for " + "disordered matter, where g(r) reaches one within a few angstrom " + "and the transform is well behaved.\\n\\n" + "**Quadrature.** The integral is evaluated on whatever r grid " + "mv.prop.rdf produced, and the error falls linearly with its step: " + "against the closed form for hard spheres it is 0.24 at a step of " + "0.10 angstrom, 0.12 at 0.05, 0.048 at 0.02 and 0.012 at 0.005. " + "The default step of 0.05 is fine for a shape and coarse for a " + "comparison against a measurement; pass a smaller one to " + "mv.prop.rdf when that matters.\\n\\n" + "The number density comes from the structures, so an object whose " + "rows are of different densities gets a different rho for each, " + "which is correct and is why this needs source= as well as the " + "stored g(r).", +) +def scattering(md: AnnData, level: str = "calc", quantity: str = "rdf", + source: str = "input", q_max: float = 15.0, + n_points: int = 300) -> None: + """Structure factor and reduced PDF. Deposits; returns ``None``.""" + from ._core import grid_of + + key = f"{quantity}_{level}" + if key not in md.obsm: + raise ValueError( + f"obsm[{key!r}] absent; run mv.prop.rdf(md, level={level!r}) " + f"first, or point quantity= at the block that holds g(r) — " + f"mv.md.rdf stores it as 'rdf_md'") + + distance = np.asarray(grid_of(md, quantity), dtype=float) + pair = np.asarray(md.obsm[key], dtype=float) + q = np.linspace(max(2.0 * np.pi / max(distance.max(), 1.0), 0.2), + float(q_max), int(n_points)) + + densities = np.array([len(s) / s.volume for s in structures(md, source)], + dtype=float) + if len(densities) != md.n_obs: + raise ValueError("one structure per row is needed for the density") + + factor = np.full((md.n_obs, q.size), np.nan) + reduced = np.full((md.n_obs, distance.size), np.nan) + for i, (g, rho) in enumerate(zip(pair, densities)): + if not np.isfinite(g).all(): + continue + integrand = distance * (g - 1.0) + # One quadrature per q rather than an FFT: the r grid is whatever + # mv.prop.rdf chose and need not be uniform or start at zero. + transform = np.array( + [np.trapezoid(integrand * np.sin(value * distance), distance) + for value in q]) + factor[i] = 1.0 + 4.0 * np.pi * rho / q * transform + reduced[i] = 4.0 * np.pi * distance * rho * (g - 1.0) + + deposit_grid(md, "structure_factor", level, factor, q, + unit="angstrom^-1", value_unit="dimensionless", + source_quantity=quantity) + deposit_grid(md, "pdf", level, reduced, distance, unit="angstrom", + value_unit="angstrom^-2", source_quantity=quantity) + md.uns.setdefault("scattering", {})[level] = { + "quantity": str(quantity), + "r_max": float(distance.max()), + "q_max": float(q_max), + "number_density": densities.tolist(), + "note": "S(q) and G(r) are definitions, not fits; the oscillations " + "below about 2 pi / r_max are termination ripple from the " + "finite range of g(r) and not structure", + } + record(md, "prop.scattering", level=level, quantity=quantity, + q_max=q_max) + + +#: Terahertz to kelvin, for a phonon frequency read as a temperature. +_THZ_TO_KELVIN = 47.9924 + +@register_function( + aliases=["superconductivity", "allen-dynes", "superconducting " + "transition", "Tc", "mcmillan", "omega log", "electron-phonon", + "phonon logarithmic average"], + category="prop", + description="The logarithmic phonon average from a computed density of " + "states, and the Allen-Dynes critical temperature it implies " + "for a coupling strength you supply.", + requires={"obsm": ["phonon_dos_{level}"], "uns": ["grids"]}, + produces={"obs": ["omega_log_{level}", "omega_2_{level}", + "critical_temperature_{level}"], + "uns": ["superconductivity"]}, + prerequisites=["mv.prop.phonon"], + examples=["mv.prop.superconductivity(md, level='emt', coupling=1.0)", + "mv.prop.superconductivity(md, level='emt', coupling=1.5, " + "mu_star=0.10)"], + related=["mv.prop.phonon", "mv.prop.dispersion", "mv.elec.bands"], + notes="Half of this is computed and half is supplied, and the division " + "matters more than the formula.\\n\\n" + "**Computed.** omega_log and omega_2 are moments of the phonon " + "density of states mv.prop.phonon already produced. A density with " + "all its weight at one frequency returns that frequency exactly; a " + "density with equal weight at 4 and 16 THz returns 5.28 rather than " + "the geometric mean of 8, because the 1/omega weighting favours the " + "soft end. Both are checked that way.\\n\\n" + "**Supplied.** coupling= is lambda, the electron-phonon coupling " + "constant, and matverse cannot compute it. It is an integral over " + "the Eliashberg function alpha^2 F, which needs the electron-phonon " + "matrix elements — EPW, or Quantum ESPRESSO's ph.x, not a phonon " + "density of states. Passing a guess produces a temperature that " + "looks like a prediction and is not, which is why there is no " + "default.\\n\\n" + "**The approximation in between.** omega_log is properly a moment " + "of alpha^2 F, not of F. Using the phonon density of states in its " + "place assumes the coupling does not depend on frequency, which is " + "the Einstein-like limit and is wrong wherever one branch couples " + "much more strongly than another — which is most interesting " + "superconductors. uns records that this substitution was made.\\n\\n" + "The formula is Allen-Dynes with the strong-coupling factors f1 and " + "f2, not bare McMillan: they are within 2% of each other at lambda " + "= 0.5 and differ by 36% at lambda = 3, and leaving them out is the " + "usual reason a strong-coupling estimate comes out low. Tc goes to " + "exactly zero as lambda approaches mu*(1 + 0.62 lambda), which is " + "where the formula stops having a solution rather than where " + "superconductivity stops.\\n\\n" + "No claim is made here that this reproduces a measured Tc. That " + "would need lambda and omega_log that belong to each other, and " + "published pairs are usually fitted to the transition they are " + "then compared against.", +) +def superconductivity(md: AnnData, level: str = "emt", + coupling: float | None = None, + mu_star: float = 0.13) -> None: + """Allen-Dynes critical temperature. Deposits; returns ``None``.""" + key = f"phonon_dos_{level}" + if key not in md.obsm: + raise ValueError( + f"obsm[{key!r}] absent; run mv.prop.phonon(md, level={level!r}) " + f"first") + if coupling is None: + raise ValueError( + "coupling= (the electron-phonon constant lambda) is required and " + "has no default. matverse cannot compute it — it is an integral " + "over the Eliashberg function, which needs electron-phonon " + "matrix elements from EPW or ph.x, not a phonon density of " + "states. A guessed lambda gives a temperature that reads as a " + "prediction") + + from ._core import grid_of + + grid = np.asarray(grid_of(md, "phonon_dos"), dtype=float) + dos = np.asarray(md.obsm[key], dtype=float) + lam = float(coupling) + mu = float(mu_star) + + log_average = np.full(md.n_obs, np.nan) + second = np.full(md.n_obs, np.nan) + critical = np.full(md.n_obs, np.nan) + + for i, row in enumerate(dos): + usable = (grid > 1e-9) & np.isfinite(row) & (row > 0) + if usable.sum() < 2: + continue + frequency, weight = grid[usable], row[usable] + norm = np.trapezoid(weight / frequency, frequency) + if not norm > 0: + continue + w_log = float(np.exp(np.trapezoid( + weight / frequency * np.log(frequency), frequency) / norm)) + w_2 = float(np.sqrt(np.trapezoid( + weight / frequency * frequency ** 2, frequency) / norm)) + log_average[i] = w_log + second[i] = w_2 + critical[i] = _allen_dynes(lam, w_log * _THZ_TO_KELVIN, + w_2 * _THZ_TO_KELVIN, mu) + + md.obs[f"omega_log_{level}"] = log_average + md.obs[f"omega_2_{level}"] = second + md.obs[f"critical_temperature_{level}"] = critical + md.uns.setdefault("superconductivity", {})[level] = { + "coupling": lam, + "mu_star": mu, + "frequency_unit": "THz", + "temperature_unit": "K", + "coupling_source": "supplied by the caller; not computed here", + "spectral_function": "the phonon density of states was used in place " + "of alpha^2 F, which assumes the coupling does " + "not depend on frequency", + "formula": "Allen-Dynes with the f1 and f2 strong-coupling factors", + } + record(md, "prop.superconductivity", level=level, coupling=lam, + mu_star=mu) + + +def _allen_dynes(lam: float, omega_log: float, omega_2: float, + mu_star: float) -> float: + """Allen-Dynes Tc in kelvin, with the strong-coupling corrections.""" + denominator = lam - mu_star * (1.0 + 0.62 * lam) + if denominator <= 0: + # Below this the exponent diverges; the formula has stopped having a + # solution, which is not the same as superconductivity stopping. + return 0.0 + lambda_1 = 2.46 * (1.0 + 3.8 * mu_star) + ratio = omega_2 / omega_log if omega_log > 0 else 1.0 + lambda_2 = 1.82 * (1.0 + 6.3 * mu_star) * ratio + f1 = (1.0 + (lam / lambda_1) ** 1.5) ** (1.0 / 3.0) + f2 = 1.0 + (ratio - 1.0) * lam ** 2 / (lam ** 2 + lambda_2 ** 2) + return float(f1 * f2 * omega_log / 1.2 + * np.exp(-1.04 * (1.0 + lam) / denominator)) + + +#: Sommerfeld value of the Lorenz number, in W ohm / K^2. +_LORENZ = 2.44e-8 + + +@register_function( + aliases=["zT", "figure of merit", "thermoelectric figure of merit", + "thermoelectric efficiency", "how good a thermoelectric"], + category="prop", + description="The thermoelectric figure of merit from the Seebeck " + "coefficient, conductivity and thermal conductivity already " + "computed — and the ceiling that needs none of them.", + requires={"obs": ["seebeck_{level}", "sigma_over_tau_{level}"]}, + produces={"obs": ["zt_{level}", "zt_ceiling_{level}", + "kappa_electronic_{level}"], + "uns": ["figure_of_merit"]}, + prerequisites=["mv.elec.transport"], + examples=["mv.prop.zt(md, level='pbe', relaxation_time=1e-14)", + "mv.prop.zt(md, level='pbe', relaxation_time=1e-14, " + "temperature=700.0)"], + related=["mv.elec.transport", "mv.prop.thermal_conductivity", + "mv.prop.kappa_bte", "mv.screen.pareto"], + notes="zT = S^2 sigma T / kappa needs three numbers and matverse has one " + "and a half of them honestly.\\n\\n" + "S is computed. sigma is not: mv.elec.transport works in the " + "constant relaxation time approximation and produces sigma/tau, " + "because tau is what that approximation declines to supply. So " + "relaxation_time= is required here and has no default, in the same " + "way coupling= is required by mv.prop.superconductivity — a guessed " + "tau produces a figure of merit that reads as a prediction.\\n\\n" + "**The ceiling needs no tau at all, and is the number to trust.** " + "tau appears in sigma and again in the electronic thermal " + "conductivity through Wiedemann-Franz, so as the lattice term stops " + "mattering it cancels exactly and zT approaches S^2 / L, with L the " + "Lorenz number. That limit is checked: at 200 microvolts per kelvin " + "the computed zT climbs 0.027, 0.24, 1.03, 1.55 as sigma goes up by " + "decades and settles at 1.6384 against an analytic 1.6393. A " + "material whose Seebeck coefficient puts its ceiling below the zT " + "you need cannot be rescued by any conductivity, and that " + "conclusion survives not knowing tau.\\n\\n" + "kappa is the third number and the weakest. Without " + "mv.prop.thermal_conductivity having run this uses only the " + "electronic part, which flatters every material; with it, the " + "lattice part is the Slack model, which its own notes call an " + "order-of-magnitude estimate. Between a guessed tau and an " + "order-of-magnitude kappa, a zT from this belongs in a ranking and " + "not in a paper.", +) +def zt(md: AnnData, level: str = "dft", relaxation_time: float | None = None, + temperature: float = 300.0) -> None: + """Thermoelectric figure of merit. Deposits; returns ``None``.""" + seebeck_key = f"seebeck_{level}" + sigma_key = f"sigma_over_tau_{level}" + for key in (seebeck_key, sigma_key): + if key not in md.obs: + raise ValueError( + f"obs[{key!r}] absent; run mv.elec.transport(md, " + f"bandstructures, level={level!r}) first") + if relaxation_time is None: + raise ValueError( + "relaxation_time= is required and has no default. " + "mv.elec.transport works in the constant relaxation time " + "approximation, which produces sigma/tau precisely because it " + "cannot supply tau; a guessed one gives a figure of merit that " + "reads as a prediction. obs['zt_ceiling_{level}'] is computed " + "regardless and needs no tau — pass any tau to get it, or read " + "the Seebeck coefficient directly") + + tau = float(relaxation_time) + kelvin = float(temperature) + seebeck = pd.to_numeric(md.obs[seebeck_key], errors="coerce").to_numpy( + dtype=float) + sigma = pd.to_numeric(md.obs[sigma_key], errors="coerce").to_numpy( + dtype=float) * tau + + electronic = _LORENZ * sigma * kelvin + lattice_key = f"thermal_conductivity_{level}" + lattice = (pd.to_numeric(md.obs[lattice_key], errors="coerce").to_numpy( + dtype=float) if lattice_key in md.obs else np.zeros(md.n_obs)) + + total = lattice + electronic + with np.errstate(divide="ignore", invalid="ignore"): + merit = np.where(total > 0, + seebeck ** 2 * sigma * kelvin / total, np.nan) + ceiling = seebeck ** 2 / _LORENZ + + md.obs[f"zt_{level}"] = merit + md.obs[f"zt_ceiling_{level}"] = ceiling + md.obs[f"kappa_electronic_{level}"] = electronic + md.uns.setdefault("figure_of_merit", {})[level] = { + "temperature": kelvin, + "relaxation_time_s": tau, + "relaxation_time_source": "supplied by the caller; the constant " + "relaxation time approximation cannot " + "produce it", + "lattice_thermal_conductivity": ("from mv.prop.thermal_conductivity" + if lattice_key in md.obs else + "absent — only the electronic part " + "is counted, which flatters every " + "material"), + "lorenz_number": _LORENZ, + "ceiling_note": "zt_ceiling is S^2 / L, the value zT approaches when " + "the lattice term stops mattering; tau cancels " + "between sigma and the electronic thermal " + "conductivity, so this one number needs no tau", + } + if lattice_key not in md.obs: + warnings.warn( + f"obs[{lattice_key!r}] absent, so only the electronic thermal " + f"conductivity is counted and every zT here is an overestimate. " + f"Run mv.prop.thermal_conductivity for the lattice part", + RuntimeWarning, stacklevel=2) + record(md, "prop.zt", level=level, relaxation_time=tau, + temperature=kelvin) diff --git a/matverse/surf.py b/matverse/surf.py index 85d5616..af15daa 100644 --- a/matverse/surf.py +++ b/matverse/surf.py @@ -29,6 +29,8 @@ from __future__ import annotations +import warnings + import numpy as np import pandas as pd from anndata import AnnData @@ -583,3 +585,167 @@ def adsorption_energy(configs: AnnData, clean: AnnData, reference: float, __all__ = ["slabs", "surface_energy", "wulff", "adsorption_sites", "adsorption_energy"] + + +@register_function( + aliases=["scaling relation", "brønsted-evans-polanyi", "BEP", "linear " + "scaling", "adsorbate scaling", "descriptor for catalysis"], + category="surf", + description="Fit the linear relation between two adsorbates' binding " + "energies across a set of surfaces — the reason one descriptor " + "can stand for a whole reaction.", + requires={"obs": ["{x}", "{y}"]}, + produces={"obs": ["scaling_residual"], "uns": ["scaling"]}, + prerequisites=["mv.surf.adsorption_energy"], + examples=["mv.surf.scaling(md, x='adsorption_energy_O_emt', " + "y='adsorption_energy_OH_emt')", + "mv.surf.scaling(md, x='E_O', y='E_OOH', group='facet')"], + related=["mv.surf.adsorption_energy", "mv.surf.volcano", + "mv.screen.rank", "mv.pl.parity"], + notes="Adsorbates that bind through the same atom bind in proportion: on " + "a metal that holds oxygen tightly, hydroxyl is held tightly too, " + "and the ratio is set by how many bonds each makes rather than by " + "which metal it is. That is why a screen over a whole reaction can " + "be run on one number, and it is also why the reaction has a " + "ceiling — the intermediate you want to bind weakly is tied to the " + "one you want to bind strongly.\\n\\n" + "The slope is the physical claim. A species bonding through one " + "atom with n remaining valences scales against a reference species " + "with m as roughly n/m: OH against O is about 1/2, OOH against O " + "about 1/2 as well, and a fitted slope far from a small rational " + "number usually means the two species are not binding the way the " + "argument assumes.\\n\\n" + "obs['scaling_residual'] is where a surface departs from the line, " + "and it is the interesting column rather than the fit. A catalyst " + "that beats the scaling ceiling has to break the relation, so a " + "large residual is a candidate and a small one is a confirmation " + "that this surface offers nothing new.\\n\\n" + "Fitted by least squares on whatever rows carry both columns; rows " + "missing either are excluded and counted rather than imputed.", +) +def scaling(md: AnnData, x: str, y: str, group: str | None = None) -> None: + """Linear scaling between two adsorbates. Deposits; returns ``None``.""" + for column in (x, y): + if column not in md.obs: + raise ValueError( + f"obs[{column!r}] absent; run mv.surf.adsorption_energy for " + f"each adsorbate first, or point x=/y= at the columns that " + f"hold them — this object has " + f"{[c for c in md.obs.columns if 'adsorption' in c][:6]}") + if group is not None and group not in md.obs: + raise ValueError(f"obs[{group!r}] absent") + + left = pd.to_numeric(md.obs[x], errors="coerce").to_numpy(dtype=float) + right = pd.to_numeric(md.obs[y], errors="coerce").to_numpy(dtype=float) + labels = (md.obs[group].astype(str).to_numpy() if group is not None + else np.full(md.n_obs, "all", dtype=object)) + + residual = np.full(md.n_obs, np.nan) + fits, skipped = {}, 0 + + for label in dict.fromkeys(labels): + mask = (labels == label) & np.isfinite(left) & np.isfinite(right) + if mask.sum() < 3: + skipped += int(mask.sum()) + continue + slope, intercept = np.polyfit(left[mask], right[mask], 1) + predicted = slope * left[mask] + intercept + residual[mask] = right[mask] - predicted + spread = right[mask] - right[mask].mean() + total = float((spread ** 2).sum()) + fits[str(label)] = { + "slope": float(slope), + "intercept_eV": float(intercept), + "rmse_eV": float(np.sqrt(np.mean((right[mask] - predicted) ** 2))), + "r_squared": float(1.0 - ((right[mask] - predicted) ** 2).sum() + / total) if total > 0 else float("nan"), + "n_points": int(mask.sum()), + } + + md.obs["scaling_residual"] = residual + md.uns["scaling"] = { + "x": str(x), "y": str(y), "group": group, + "fits": fits, + "n_excluded": int(np.isnan(residual).sum()), + "note": "least squares on rows carrying both columns; the residual is " + "the departure from the line and is the column worth reading", + } + if not fits: + raise ValueError( + f"no group had three points with both {x!r} and {y!r}; a line " + f"through two points is not a scaling relation") + if skipped: + warnings.warn( + f"{skipped} rows are in groups too small to fit and have no " + f"residual; a scaling relation needs at least three surfaces", + RuntimeWarning, stacklevel=2) + record(md, "surf.scaling", x=x, y=y, group=group) + + +@register_function( + aliases=["volcano", "volcano plot", "sabatier", "activity descriptor", + "catalytic activity", "optimal binding"], + category="surf", + description="Sabatier activity against a binding-energy descriptor — the " + "volcano — with the optimum and each surface's distance from " + "it.", + requires={"obs": ["{descriptor}"]}, + produces={"obs": ["volcano_activity", "distance_from_optimum"], + "uns": ["volcano"]}, + prerequisites=["mv.surf.adsorption_energy"], + examples=["mv.surf.volcano(md, descriptor='adsorption_energy_O_emt', " + "optimum=-1.6)", + "mv.surf.volcano(md, descriptor='E_O', optimum=-1.6, " + "slopes=(1.0, -1.0))"], + related=["mv.surf.scaling", "mv.surf.adsorption_energy", + "mv.screen.rank", "mv.pl.scatter"], + notes="Sabatier's argument in one column: bind the intermediate too " + "weakly and it never forms, too strongly and it never leaves, so " + "activity peaks somewhere in between. The two limits are lines with " + "opposite slopes in the binding energy, and the activity is " + "whichever is smaller — a minimum of two straight lines, which is " + "why the plot is a peak with straight flanks rather than a " + "curve.\\n\\n" + "**The optimum is an input, not a result.** Where the peak sits " + "depends on the reaction, the potential and the conditions, and it " + "comes from a microkinetic model or from experiment. Passing one " + "and reading the ranking is legitimate; treating the ranking as a " + "prediction of turnover is not, and the difference is that " + "everything here is a *relative* ordering of surfaces against an " + "optimum somebody else established.\\n\\n" + "The activity is in arbitrary units and only its ordering means " + "anything. obs['distance_from_optimum'] is the honest column: it is " + "in electronvolts, it says which side the surface falls on through " + "its sign, and it does not pretend to be a rate.", +) +def volcano(md: AnnData, descriptor: str, optimum: float, + slopes: tuple = (1.0, -1.0)) -> None: + """Sabatier activity against a descriptor. Deposits; returns ``None``.""" + if descriptor not in md.obs: + raise ValueError( + f"obs[{descriptor!r}] absent; this object has " + f"{[c for c in md.obs.columns if 'adsorption' in c][:6]}") + if len(slopes) != 2 or slopes[0] <= 0 or slopes[1] >= 0: + raise ValueError( + f"slopes={slopes} must be one positive and one negative — the " + f"two limbs of a volcano have opposite signs, and giving them the " + f"same sign produces a straight line dressed as a peak") + + values = pd.to_numeric(md.obs[descriptor], errors="coerce").to_numpy( + dtype=float) + offset = values - float(optimum) + weak, strong = float(slopes[0]), float(slopes[1]) + activity = np.minimum(weak * offset, strong * offset) + + md.obs["volcano_activity"] = activity + md.obs["distance_from_optimum"] = offset + md.uns["volcano"] = { + "descriptor": str(descriptor), + "optimum": float(optimum), + "slopes": [weak, strong], + "optimum_source": "supplied by the caller; not derived here", + "n_missing": int(np.isnan(values).sum()), + "note": "activity is in arbitrary units and only its ordering is " + "meaningful; distance_from_optimum is in eV and signed", + } + record(md, "surf.volcano", descriptor=descriptor, optimum=optimum) diff --git a/matverse/thermo.py b/matverse/thermo.py index 17fb8c7..4cb1447 100644 --- a/matverse/thermo.py +++ b/matverse/thermo.py @@ -1345,3 +1345,313 @@ def calphad(md: AnnData, database, temperature: float = 300.0, f"see uns['calphad']['errors']. First: {skipped[0]}", RuntimeWarning, stacklevel=2) record(md, "thermo.calphad", temperature=temperature, elements=wanted) + + +@register_function( + aliases=["voltage", "intercalation voltage", "electrode", "battery", + "average voltage", "capacity", "cathode", "what voltage does " + "this give", "energy density"], + category="thermo", + description="Average intercalation voltage and capacity for an electrode, " + "from the energies of its lithiated and delithiated forms.", + requires={"obs": ["energy_{level}"], "structures": ["{source}"]}, + produces={"obs": ["voltage_{level}", "capacity_gravimetric_{level}", + "capacity_volumetric_{level}", + "energy_density_{level}", "volume_change_{level}"], + "uns": ["electrode"]}, + prerequisites=["mv.calc.relax"], + dispatch="level= names the energies the voltage is computed from", + examples=["mv.thermo.voltage(md, working_ion='Li', level='chgnet')", + "mv.thermo.voltage(md, working_ion='Na', level='pbe', " + "reference=metal_na)"], + related=["mv.thermo.hull", "mv.neb.barrier", "mv.md.conductivity", + "mv.prop.cost"], + notes="The voltage is the hull slope in the working-ion direction, and " + "nothing more: V = -(E_lithiated - E_delithiated - n E_ion) / n, in " + "volts because an electron carries one. Everything needed was " + "already here — mv.thermo.hull builds the same energies — and the " + "only thing missing was reading the slope off.\\n\\n" + "**The reference matters more than the cathode.** V is measured " + "against the working ion's own metal, so a wrong energy for lithium " + "metal shifts every voltage by the same amount and no comparison " + "between cathodes reveals it. Pass reference= with a relaxed " + "elemental structure computed at the same level; without it this " + "raises rather than guessing, because a guessed reference is a " + "constant offset that looks like a result.\\n\\n" + "Checked against LiFePO4, whose plateau is measured at 3.4-3.5 V " + "with a theoretical capacity of 170 mAh/g. CHGNet, which is trained " + "on PBE+U and so on the functional this problem needs, gives 3.497 " + "V and 169.9 mAh/g. Plain PBE gives closer to 3.0 V for the same " + "material — the +U matters here, and level= is what records which " + "was used.\\n\\n" + "obs['volume_change_{level}'] is the weakest number here and is " + "worth reading with that in mind. On the LiFePO4 check it comes out " + "at -14%% against a measured -6.8%%, because those energies come " + "from a positions-only relaxation: the cell was held at its " + "experimental shape and never allowed to respond to delithiation. " + "Relaxing the cell would fix that in principle and diverges in " + "practice on this system, which is why the voltage is the number to " + "trust and the volume change is a flag rather than a measurement.\\n\\n" + "Rows whose relaxation did not converge are excluded, and the " + "reference is refused outright if it did not. That is not " + "defensive programming: the first version of this read the energies " + "without checking and returned 78 V for LiFePO4, because a cell " + "relaxation with CHGNet had collapsed the lithiated structure to 2 " + "cubic angstrom per atom and expanded the delithiated one to 117. " + "obs['relax_converged_{level}'] was False for both the whole time. " + "A foundation potential relaxing the cell of a delithiated " + "framework is a known place for this; mv.calc.relax(cell=False) " + "relaxes positions only and is the usual way round it.\\n\\n" + "This is an *average* voltage between two states, not a curve. A " + "real cell has plateaux and slopes set by the intermediate " + "orderings, and resolving them means supplying those intermediates " + "as rows: pass three or more compositions along the same " + "framework and each adjacent pair gets its own step, which " + "uns['electrode'] records.", +) +def voltage(md: AnnData, working_ion: str = "Li", level: str = "emt", + source: str = "input", reference=None, + framework: str | None = None) -> None: + """Intercalation voltage and capacity. Deposits; returns ``None``.""" + from pymatgen.apps.battery.insertion_battery import InsertionElectrode + from pymatgen.core import Composition, Element + from pymatgen.entries.computed_entries import ComputedStructureEntry + + energy_key = f"energy_{level}" + if energy_key not in md.obs: + raise ValueError( + f"obs[{energy_key!r}] absent; run mv.calc.relax(md, " + f"level={level!r}) first — a voltage is a difference of relaxed " + f"energies and an unrelaxed one is not a state of the material") + ion = Element(str(working_ion)) + + if reference is None: + raise ValueError( + f"reference= is required: the voltage is measured against " + f"{ion.symbol} metal, so it needs that metal's energy at the same " + f"level. Pass a one-row object holding a relaxed elemental " + f"{ion.symbol} structure with obs[{energy_key!r}]. Guessing it " + f"would shift every voltage by the same amount, which no " + f"comparison between cathodes would reveal") + if reference.n_obs != 1 or energy_key not in reference.obs: + raise ValueError( + f"reference must be a single row carrying obs[{energy_key!r}]") + reference_structure = structures(reference, source)[0] + per_ion = (float(reference.obs[energy_key].iloc[0]) + / max(len(reference_structure), 1)) + ion_entry = ComputedStructureEntry(reference_structure, + float(reference.obs[energy_key].iloc[0])) + + # A voltage is a difference of relaxed energies, so an unconverged + # relaxation makes it meaningless — and mv.calc.relax already says which + # rows those are. The first version of this read energy_{level} without + # looking, and cheerfully returned 78 V for LiFePO4 from a cell that had + # collapsed to 2 cubic angstrom per atom. The diagnostic existed; the + # function did not consult it. + converged_key = f"relax_converged_{level}" + unconverged = [] + entries, rows = [], [] + for i, structure in enumerate(structures(md, source)): + value = float(md.obs[energy_key].iloc[i]) + if not np.isfinite(value): + continue + if converged_key in md.obs and not bool(md.obs[converged_key].iloc[i]): + unconverged.append(str(md.obs_names[i])) + continue + entries.append(ComputedStructureEntry(structure, value)) + rows.append(i) + + if converged_key in reference.obs and not bool( + reference.obs[converged_key].iloc[0]): + raise ValueError( + f"the {ion.symbol} reference did not converge; every voltage " + f"would be shifted by the same amount and no comparison between " + f"cathodes would reveal it") + + # Group by the framework left when the working ion is removed, so two + # unrelated cathodes in one object do not get averaged into one electrode. + groups: dict = {} + for entry, i in zip(entries, rows): + composition = entry.composition.copy() + stripped = Composition({el: n for el, n in composition.items() + if el.symbol != ion.symbol}) + label = (framework if framework is not None + else stripped.reduced_formula or "empty") + groups.setdefault(label, []).append((entry, i)) + + if unconverged: + warnings.warn( + f"{len(unconverged)} structures are excluded because their " + f"relaxation did not converge: {unconverged[:5]}. A voltage from " + f"an unrelaxed cell is not a voltage. Check " + f"obs['max_force_{level}'] — a cell relaxation with a foundation " + f"potential can run away on a delithiated framework, and " + f"mv.calc.relax(cell=False) is the usual way round it", + RuntimeWarning, stacklevel=2) + + volts = np.full(md.n_obs, np.nan) + grav = np.full(md.n_obs, np.nan) + vol = np.full(md.n_obs, np.nan) + density = np.full(md.n_obs, np.nan) + swelling = np.full(md.n_obs, np.nan) + recorded, failures = {}, [] + + for label, members in groups.items(): + if len(members) < 2: + failures.append( + f"{label}: only one composition, so there is no pair to take " + f"a difference between — supply both the lithiated and the " + f"delithiated form") + continue + try: + electrode = InsertionElectrode.from_entries( + [entry for entry, _ in members], ion_entry) + average = float(electrode.get_average_voltage()) + gravimetric = float(electrode.get_capacity_grav()) + volumetric = float(electrode.get_capacity_vol()) + except Exception as exc: + failures.append(f"{label}: {type(exc).__name__}: {exc}") + continue + + amounts = [entry.composition.get(ion.symbol, 0.0) + for entry, _ in members] + volumes = [entry.structure.volume / len(entry.structure) + for entry, _ in members] + order = int(np.argmax(amounts)), int(np.argmin(amounts)) + change = (100.0 * (volumes[order[0]] - volumes[order[1]]) + / volumes[order[1]]) if volumes[order[1]] else np.nan + + for _, i in members: + volts[i] = average + grav[i] = gravimetric + vol[i] = volumetric + density[i] = average * gravimetric # V * mAh/g = mWh/g + swelling[i] = change + recorded[label] = { + "average_voltage": average, + "capacity_gravimetric_mAh_per_g": gravimetric, + "capacity_volumetric_mAh_per_cc": volumetric, + "volume_change_percent": float(change), + "n_states": len(members), + } + + md.obs[f"voltage_{level}"] = volts + md.obs[f"capacity_gravimetric_{level}"] = grav + md.obs[f"capacity_volumetric_{level}"] = vol + md.obs[f"energy_density_{level}"] = density + md.obs[f"volume_change_{level}"] = swelling + md.uns.setdefault("electrode", {})[level] = { + "working_ion": ion.symbol, + "reference_energy_per_atom": per_ion, + "frameworks": recorded, + "n_failed": len(failures), + "errors": failures[:10], + "unconverged": unconverged[:10], + "note": "average voltage between the supplied states, against the " + "working ion's own metal; not a discharge curve unless the " + "intermediate orderings were supplied as rows", + } + # No set_level here. This derives from energies somebody else computed, + # and stamping the level as "derived" would overwrite the record of the + # calculator that actually produced them — which is the one fact a + # voltage needs carried with it. mv.thermo.hull does not stamp one + # either, for the same reason. + if failures: + warnings.warn( + f"{len(failures)} frameworks produced no voltage; see " + f"uns['electrode'][{level!r}]['errors']. First: {failures[0]}", + RuntimeWarning, stacklevel=2) + record(md, "thermo.voltage", working_ion=ion.symbol, level=level, + source=source) + + +@register_function( + aliases=["theoretical capacity", "maximum capacity", "capacity limit", + "how much lithium can it hold", "ion removal", "ion insertion"], + category="thermo", + description="The capacity a structure could give up or take in, from its " + "oxidation states alone — no delithiated structure needed.", + requires={"structures": ["{source}"]}, + # The placeholder is the parameter's own name: the probe expands claims + # by binding the signature, so {ion} matched nothing and every claim here + # read as unfulfilled. + produces={"obs": ["max_ion_removal_{working_ion}", + "max_ion_insertion_{working_ion}", + "theoretical_capacity_{working_ion}", + "theoretical_capacity_volumetric_{working_ion}"], + "uns": ["theoretical_capacity"]}, + prerequisites=["mv.pp.describe"], + examples=["mv.thermo.theoretical_capacity(md)", + "mv.thermo.theoretical_capacity(md, working_ion='Na')"], + related=["mv.thermo.voltage", "mv.transform.oxidation_states", + "mv.prop.cost"], + notes="mv.thermo.voltage needs both ends of the reaction — the lithiated " + "and the delithiated structure — and gives a voltage. This needs " + "**one** structure and gives an upper bound on capacity, which is " + "the question a screen asks first and much more cheaply. Ranking a " + "library on this and then computing voltages for the survivors is " + "the order that costs least.\\n\\n" + "It is a bound and not a prediction. The number counts the " + "electrons the transition metals could in principle give up, and " + "says nothing about whether the framework survives losing them: " + "LiFePO4 comes out at 169.9 mAh/g against a measured 170 because " + "one electron per iron is exactly what happens there, and a " + "material whose framework collapses at half that will report the " + "same bound.\\n\\n" + "Oxidation states come from bond valence, which is a fit to bond " + "lengths and fails on structures far from the ones it was fitted " + "to. A row it cannot assign is left NaN and counted rather than " + "guessed, because a wrong oxidation state changes the answer by a " + "whole electron.", +) +def theoretical_capacity(md: AnnData, working_ion: str = "Li", + source: str = "input") -> None: + """Capacity bound from oxidation states. Deposits; returns ``None``.""" + from pymatgen.analysis.bond_valence import BVAnalyzer + from pymatgen.apps.battery.analyzer import BatteryAnalyzer + + ion = str(working_ion) + removal = np.full(md.n_obs, np.nan) + insertion = np.full(md.n_obs, np.nan) + gravimetric = np.full(md.n_obs, np.nan) + volumetric = np.full(md.n_obs, np.nan) + failures = [] + + analyzer = BVAnalyzer() + for i, structure in enumerate(structures(md, source)): + try: + decorated = analyzer.get_oxi_state_decorated_structure(structure) + except Exception as exc: + failures.append( + f"{md.obs_names[i]}: bond valence could not assign oxidation " + f"states ({type(exc).__name__}: {exc})") + continue + try: + battery = BatteryAnalyzer(decorated, working_ion=ion) + removal[i] = float(battery.max_ion_removal) + insertion[i] = float(battery.max_ion_insertion) + gravimetric[i] = float(battery.get_max_capgrav()) + volumetric[i] = float(battery.get_max_capvol()) + except Exception as exc: + failures.append(f"{md.obs_names[i]}: {type(exc).__name__}: {exc}") + + md.obs[f"max_ion_removal_{ion}"] = removal + md.obs[f"max_ion_insertion_{ion}"] = insertion + md.obs[f"theoretical_capacity_{ion}"] = gravimetric + md.obs[f"theoretical_capacity_volumetric_{ion}"] = volumetric + md.uns.setdefault("theoretical_capacity", {})[ion] = { + "working_ion": ion, + "source": str(source), + "oxidation_states": "bond valence", + "capacity_unit": "mAh/g", + "n_failed": len(failures), + "errors": failures[:10], + "note": "an upper bound from electron counting; it says nothing " + "about whether the framework survives being emptied", + } + if failures: + warnings.warn( + f"{len(failures)} of {md.n_obs} structures got no capacity; see " + f"uns['theoretical_capacity'][{ion!r}]['errors']. First: " + f"{failures[0]}", RuntimeWarning, stacklevel=2) + record(md, "thermo.theoretical_capacity", working_ion=ion, source=source) diff --git a/matverse_guide/docs/_scripts/nb_beyond_one_number.py b/matverse_guide/docs/_scripts/nb_beyond_one_number.py index cbfa9a9..ec96da9 100644 --- a/matverse_guide/docs/_scripts/nb_beyond_one_number.py +++ b/matverse_guide/docs/_scripts/nb_beyond_one_number.py @@ -1038,5 +1038,205 @@ def cell(formula): A material containing an element the database does not assess is **skipped and counted**, never projected onto the elements that remain. Dropping the copper from PbSnCu and renormalising would answer a question about a different alloy. +```"""), + + ("markdown", """\ +## A voltage is a slope on the hull + +`mv.thermo.hull` already computes the energies an intercalation voltage is made +of. The voltage *is* the hull slope along the working-ion axis: + +$$V = -\\frac{E_{\\mathrm{lithiated}} - E_{\\mathrm{delithiated}} - n\\,E_{\\mathrm{Li}}}{n}$$ + +in volts, because an electron carries one. `mv.thermo.voltage` reads it off."""), + + ("code", """\ +from pymatgen.core import Lattice, Structure + +cathode = mv.datasets.load("battery_cathodes")[:1].copy() +lithiated = mv.structures(cathode, "input")[0] +delithiated = lithiated.copy() +delithiated.remove_species(["Li"]) + +electrode = mv.data.from_structures([lithiated, delithiated]) +electrode.obs_names = ["LiFePO4", "FePO4"] +metal = mv.data.from_structures([Structure( + Lattice.cubic(3.51), ["Li", "Li"], [[0, 0, 0], [.5, .5, .5]])]) + +try: + # cell=False on purpose: see the warning below. + for piece in (electrode, metal): + mv.calc.relax(piece, level="chgnet", fmax=0.05, cell=False) + mv.thermo.voltage(electrode, working_ion="Li", level="chgnet", + source="relaxed_chgnet", reference=metal) + print(electrode.obs[["voltage_chgnet", "capacity_gravimetric_chgnet", + "energy_density_chgnet"]].round(2).head(1).to_string()) +except (ImportError, KeyError) as exc: + print("needs CHGNet; pip install matverse[potentials]", exc)"""), + + ("markdown", """\ +**3.50 V and 169.9 mAh/g**, against a measured plateau of 3.4–3.5 V and a +theoretical capacity of 170. CHGNet is trained on PBE+U, which is the +functional this problem needs — plain PBE gives closer to 3.0 V for the same +material, and `level=` is what records which was used. + +```{warning} +`cell=False` is not incidental. Relaxing the **cell** of these structures with a +foundation potential diverges: it collapsed LiFePO₄ to 2 ų per atom and +expanded FePO₄ to 117, and the first version of `mv.thermo.voltage` read the +resulting energies and returned **78 V**. `mv.calc.relax` had recorded +`relax_converged_chgnet = False` for both rows the whole time — the diagnostic +existed and the function did not consult it. + +It does now: unconverged rows are excluded and counted, and an unconverged +**reference** raises outright, because a bad lithium-metal energy shifts every +voltage by the same amount and no comparison between cathodes would reveal it. +``` + +`obs['volume_change_chgnet']` is the weakest number of the set — about −14% +here against a measured −6.8%, precisely because the cell was held fixed and +never allowed to respond to delithiation. It is a flag, not a measurement."""), + + ("markdown", """\ +### The cheaper question, asked first + +A voltage needs both ends of the reaction. `mv.thermo.theoretical_capacity` +needs **one structure** and counts the electrons the transition metals could +give up — which is the question a screen asks first, and much more cheaply."""), + + ("code", """\ +library = mv.datasets.load("battery_cathodes") +mv.thermo.theoretical_capacity(library, working_ion="Li") +mv.thermo.theoretical_capacity(library, working_ion="Na") +print(library.obs[["theoretical_capacity_Li", + "theoretical_capacity_Na"]].round(1).to_string())"""), + + ("markdown", """\ +LiFePO₄ gives 169.9 mAh/g for lithium and zero for sodium; NaFePO₄ gives 154.2 +for sodium — the measured figure is about 154 — and zero for lithium. Asking a +lithium compound how much sodium it can release is answered correctly rather +than approximately. + +It is a **bound**, not a prediction. The number counts electrons and says +nothing about whether the framework survives losing them; a material that +collapses at half this will report the same figure. Rank a library on it, then +compute voltages for the survivors — that is the order that costs least."""), + + ("markdown", """\ +## Three numbers where matverse has one and a half + +Some quantities are a formula over inputs matverse cannot produce, and the +useful thing is to be exact about which half is which. + +`mv.prop.superconductivity` computes ω_log — a moment of the phonon density of +states `mv.prop.phonon` already produced — and then applies Allen-Dynes. It +**will not** guess the electron–phonon coupling λ, which is an integral over +α²F and needs EPW or `ph.x`, not a phonon spectrum."""), + + ("code", """\ +metals = mv.datasets.metals(["Cu", "Al"]) +mv.pp.describe(metals) +mv.calc.relax(metals, level="emt", fmax=0.01) +mv.prop.phonon(metals, level="emt", source="relaxed_emt", supercell=(2, 2, 2)) + +mv.prop.superconductivity(metals, level="emt", coupling=1.0) +print(metals.obs[["name", "omega_log_emt", "critical_temperature_emt"]] + .round(3).to_string(index=False)) + +try: + mv.prop.superconductivity(metals, level="emt") +except ValueError as exc: + print(f"\\nwithout a coupling: {str(exc)[:70]}...")"""), + + ("markdown", """\ +λ = 1.0 there was **supplied, not computed**, so the temperatures are what that +coupling would imply and not a prediction about copper — whose real λ is about +0.13, below the threshold where the formula has a solution at all, and which is +not a superconductor. + +ω_log is the computed half and is checkable: a density of states with all its +weight at one frequency returns that frequency exactly, and one with equal +weight at 4 and 16 THz returns 5.28 rather than the geometric mean of 8, because +the 1/ω weighting favours the soft end. + +```{note} +ω_log is properly a moment of α²F, not of the phonon density of states. Using +the latter assumes the coupling does not depend on frequency — the Einstein-like +limit, wrong wherever one branch couples much more strongly than another, which +is most interesting superconductors. `uns` records that the substitution was +made. +``` + +### The same shape, for thermoelectrics + +`mv.elec.transport` produces σ/τ rather than σ, because the constant relaxation +time approximation declines to supply τ. So `mv.prop.zt` requires it — and +computes, separately, the one number that does not need it."""), + + ("code", """\ +thermo = mv.data.from_compositions(["Bi2Te3"]) +thermo.obs["seebeck_x"] = [200e-6] # V/K +thermo.obs["thermal_conductivity_x"] = [1.0] # W/m/K + +for sigma_over_tau in (1e17, 1e19, 1e22): + row = thermo.copy() + row.obs["sigma_over_tau_x"] = [sigma_over_tau] + mv.prop.zt(row, level="x", relaxation_time=1e-14, temperature=700.0) + print(f"sigma/tau={sigma_over_tau:.0e} " + f"zT={float(row.obs['zt_x'].iloc[0]):.4f} " + f"ceiling={float(row.obs['zt_ceiling_x'].iloc[0]):.4f}")"""), + + ("markdown", """\ +zT climbs with conductivity and **stops** at 1.639. That ceiling is `S²/L`, and +τ cancels out of it exactly: it appears in σ and again in the electronic thermal +conductivity through Wiedemann–Franz, so as the lattice term stops mattering the +unknown divides out. + +The consequence is worth stating plainly. **A material whose Seebeck coefficient +puts its ceiling below the zT you need cannot be rescued by any conductivity** — +and that conclusion survives not knowing τ, which is the number nobody has. + +## Scaling relations, and why a reaction has a ceiling + +Adsorbates that bind through the same atom bind in proportion. That is why a +screen over a whole reaction can run on one descriptor — and why the reaction +has a ceiling, because the intermediate you want bound weakly is tied to the one +you want bound strongly."""), + + ("code", """\ +import numpy as np + +rng = np.random.default_rng(0) +oxygen = np.linspace(-2.5, 0.5, 8) +surfaces = mv.data.from_compositions([f"Pt{i + 1}" for i in range(8)]) +surfaces.obs["E_O"] = oxygen +surfaces.obs["E_OH"] = 0.5 * oxygen - 0.10 + rng.normal(0, 0.02, 8) + +mv.surf.scaling(surfaces, x="E_O", y="E_OH") +fit = surfaces.uns["scaling"]["fits"]["all"] +print(f"slope {fit['slope']:.3f} intercept {fit['intercept_eV']:.3f} eV " + f"R2 {fit['r_squared']:.4f}") + +mv.surf.volcano(surfaces, descriptor="E_O", optimum=-1.6) +print(surfaces.obs[["E_O", "scaling_residual", "distance_from_optimum", + "volcano_activity"]].round(3).to_string())"""), + + ("markdown", """\ +The slope is the physical claim: a species bonding through one atom with *n* +remaining valences scales against a reference with *m* as roughly *n/m*, so OH +against O is about ½. A fitted slope far from a small rational number usually +means the two species are not binding the way the argument assumes. + +`scaling_residual` is the interesting column, not the fit. A catalyst that beats +the scaling ceiling has to **break** the relation, so a large residual is a +candidate and a small one confirms the surface offers nothing new. + +```{warning} +The volcano's **optimum is an input**. Where the peak sits depends on the +reaction, the potential and the conditions, and it comes from a microkinetic +model or an experiment — not from here. `volcano_activity` is in arbitrary units +and only its ordering means anything; `distance_from_optimum` is in eV and +signed, so it says which side a surface falls on. Binding too weakly and too +strongly are different problems and a magnitude cannot tell them apart. ```"""), ] diff --git a/matverse_guide/docs/_scripts/nb_dynamics.py b/matverse_guide/docs/_scripts/nb_dynamics.py index 361a47b..09584c8 100644 --- a/matverse_guide/docs/_scripts/nb_dynamics.py +++ b/matverse_guide/docs/_scripts/nb_dynamics.py @@ -260,6 +260,55 @@ def torchsim_factory(): beyond it. Short-range order without long-range order is the definition of a glass, and this is what it looks like as a measurement. +### What a diffractometer would actually see + +g(r) is not what a total-scattering experiment reports. `mv.prop.scattering` +applies the two standard transforms — the structure factor S(q) and the reduced +pair distribution function G(r) — so a quenched structure made here can be +compared against a measured one."""), + + ("code", """\ +mv.prop.scattering(copper, level="amorphous", source="amorphous_emt", + q_max=12.0) + +q = mv.grid_of(copper, "structure_factor") +fig, axes = plt.subplots(1, 2, figsize=(11, 3.8)) +axes[0].plot(q, copper.obsm["structure_factor_amorphous"][0], linewidth=1.0) +axes[0].axhline(1.0, linestyle="--", color="#888", linewidth=0.8) +axes[0].set_xlabel("q (Å⁻¹)"); axes[0].set_ylabel("S(q)") +axes[0].set_title("structure factor") + +r_pdf = mv.grid_of(copper, "pdf") +axes[1].plot(r_pdf, copper.obsm["pdf_amorphous"][0], linewidth=1.0) +axes[1].axhline(0.0, linestyle="--", color="#888", linewidth=0.8) +axes[1].set_xlabel("r (Å)"); axes[1].set_ylabel("G(r)") +axes[1].set_title("reduced pair distribution") +fig.tight_layout()"""), + + ("markdown", """\ +Both are definitions rather than models: + +$$S(q) = 1 + \\frac{4\\pi\\rho}{q}\\int r\\,[g(r)-1]\\,\\sin(qr)\\,\\mathrm{d}r +\\qquad G(r) = 4\\pi r \\rho\\,[g(r)-1]$$ + +which makes them checkable. For an ideal gas, g = 1 everywhere and S(q) comes +back as 1.000000 at every q; for a hard-sphere exclusion the transform has a +closed form and this reproduces it. + +```{warning} +**This is a technique for disordered matter, and applying it to a crystal +produces nonsense.** A crystal's g(r) never decays to one, so truncating it at +`r_max` and transforming produces termination ripple larger than any real peak +— on the four textbook structures in `mv.datasets` the apparent "first peak" of +S(q) is entirely ripple. `mv.prop.xrd` is the function for a crystalline +diffraction pattern. + +The accuracy also follows the r grid `mv.prop.rdf` produced, linearly: against +the hard-sphere closed form the error is 0.24 at a step of 0.10 Å, 0.12 at 0.05, +and 0.012 at 0.005. The default is fine for a shape and coarse for a comparison +against a measurement. +``` + ## What the object remembers"""), ("code", """\ diff --git a/matverse_guide/docs/api/user.md b/matverse_guide/docs/api/user.md index e0b0fff..269368d 100644 --- a/matverse_guide/docs/api/user.md +++ b/matverse_guide/docs/api/user.md @@ -12,7 +12,7 @@ agent. Every entry names the state it reads and the state it writes, and each of those claims is verified by execution in `tests/test_contracts.py` rather than asserted. -Public registry entries listed here: 218 +Public registry entries listed here: 225 Look a function up by intent rather than by name: @@ -183,11 +183,14 @@ Derived properties, including curves stored on a shared grid. prop.polarization prop.quasiharmonic prop.rdf + prop.scattering prop.slme + prop.superconductivity prop.supply_risk prop.tem prop.thermal_conductivity prop.xrd + prop.zt ``` @@ -258,9 +261,11 @@ Slabs, surface energies, equilibrium shapes and adsorption. surf.adsorption_energy surf.adsorption_sites + surf.scaling surf.slabs surf.surface_energy surf.surface_energy_chempot + surf.volcano surf.wulff ``` @@ -284,6 +289,8 @@ Convex hull, reactions, chemical potentials. thermo.pourbaix thermo.reaction thermo.references_from_mp + thermo.theoretical_capacity + thermo.voltage ``` @@ -628,11 +635,14 @@ arguments — `obs['energy_{level}']` becomes `obs['energy_emt']` when you pass | `mv.prop.polarization` | `obs['polarization_a']`, `obs['polarization_b']`, `obs['polarization_c']`, `uns['polarization']` | | `mv.prop.quasiharmonic` | `obs['thermal_expansion_qha_{level}']`, `obs['gruneisen_{level}']`, `obs['debye_temperature_qha_{level}']`, `obs['heat_capacity_300K_{level}']`, `obsm['gibbs_{level}']`, `obsm['thermal_expansion_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | | `mv.prop.rdf` | `obsm['rdf_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | +| `mv.prop.scattering` | `obsm['structure_factor_{level}']`, `obsm['pdf_{level}']`, `uns['grids']`, `uns['scattering']` | | `mv.prop.slme` | `obs['slme_{level}']`, `obs['sq_limit_{level}']` | +| `mv.prop.superconductivity` | `obs['omega_log_{level}']`, `obs['omega_2_{level}']`, `obs['critical_temperature_{level}']`, `uns['superconductivity']` | | `mv.prop.supply_risk` | `obs['hhi_production']`, `obs['hhi_reserve']`, `obs['supply_risk']` | | `mv.prop.tem` | `obsm['tem_{level}']`, `uns['grids']`, `obs['tem_n_reflections_{level}']`, `obs['tem_strongest_{level}']`, `obs['tem_zone_axis']`, `uns['levels']['{level}']` | | `mv.prop.thermal_conductivity` | `obs['debye_temperature_{level}']`, `obs['gruneisen_{level}']`, `obs['sound_velocity_{level}']`, `obs['thermal_conductivity_{level}']` | | `mv.prop.xrd` | `obsm['xrd_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | +| `mv.prop.zt` | `obs['zt_{level}']`, `obs['zt_ceiling_{level}']`, `obs['kappa_electronic_{level}']`, `uns['figure_of_merit']` | | `mv.md.conductivity` | `obs['conductivity_{species}_{level}']` | | `mv.md.melt_quench` | `obsm['structures']['amorphous_{level}']`, `obs['amorphous_density_{level}']`, `obs['amorphous_density_ratio_{level}']`, `uns['levels']['{level}']` | | `mv.md.occupancy` | `obs['occupied_fraction_{level}']`, `obs['occupancy_entropy_{level}']`, `obs['occupancy_peak_{level}']` | @@ -650,8 +660,10 @@ arguments — `obs['energy_{level}']` becomes `obs['energy_emt']` when you pass | `mv.neb.hop_endpoints` | `obsm['structures']['{key_added}_initial']`, `obsm['structures']['{key_added}_final']`, `obs['hop_distance']`, `obs['hop_species']` | | `mv.neb.percolation` | `obs['percolation_dimensionality_{species}']`, `obs['percolation_threshold_{species}']`, `obs['percolation_sites_{species}']` | | `mv.surf.adsorption_energy` | `obs['adsorption_energy_{level}']`, `obs['is_best_site_{level}']` | +| `mv.surf.scaling` | `obs['scaling_residual']`, `uns['scaling']` | | `mv.surf.surface_energy` | `obs['surface_energy_{level}']`, `obs['surface_energy_{level}_off_stoichiometry']` | | `mv.surf.surface_energy_chempot` | `facets.obs['surface_energy_{level}']` | +| `mv.surf.volcano` | `obs['volcano_activity']`, `obs['distance_from_optimum']`, `uns['volcano']` | | `mv.surf.wulff` | `facets.obs['wulff_area_fraction_{level}']`, `bulk.obs['wulff_effective_radius_{level}']`, `bulk.obs['wulff_shape_factor_{level}']` | | `mv.thermo.calphad` | `obs['calphad_phases']`, `obs['calphad_n_phases']`, `obs['calphad_major_phase']`, `obs['calphad_major_fraction']`, `uns['calphad']` | | `mv.thermo.chempot_diagram` | `obs['chempot_stable_{level}']`, `obs['chempot_window_{level}']`, `uns['chempot_diagram']` | @@ -662,6 +674,8 @@ arguments — `obs['energy_{level}']` becomes `obs['energy_emt']` when you pass | `mv.thermo.hull` | `obs['e_above_hull_{level}']`, `obs['is_stable_{level}']`, `obs['formation_energy_{level}']`, `obs['decomposes_to_{level}']`, `uns['phase_diagram']` | | `mv.thermo.pourbaix` | `obs['pourbaix_decomposition']`, `uns['pourbaix']` | | `mv.thermo.reaction` | `uns['reactions']` | +| `mv.thermo.theoretical_capacity` | `obs['max_ion_removal_{working_ion}']`, `obs['max_ion_insertion_{working_ion}']`, `obs['theoretical_capacity_{working_ion}']`, `obs['theoretical_capacity_volumetric_{working_ion}']`, `uns['theoretical_capacity']` | +| `mv.thermo.voltage` | `obs['voltage_{level}']`, `obs['capacity_gravimetric_{level}']`, `obs['capacity_volumetric_{level}']`, `obs['energy_density_{level}']`, `obs['volume_change_{level}']`, `uns['electrode']` | | `mv.dft.read_dos` | `obsm['dos_{level}']`, `obs['band_gap_{level}']`, `obs['is_direct_gap_{level}']`, `obs['vbm_{level}']`, `obs['cbm_{level}']`, `obs['fermi_level_{level}']`, `obs['dos_at_fermi_{level}']`, `obs['is_metal_{level}']`, `uns['grids']`, `uns['levels']['{level}']` | | `mv.dft.read_outputs` | `obs['energy_{level}']`, `obs['energy_per_atom_{level}']`, `obs['band_gap_{level}']`, `obs['converged_{level}']`, `obsm['structures']['relaxed_{level}']`, `uns['levels']['{level}']`, `uns['dft']` | | `mv.dft.write_inputs` | `obs['dft_directory']`, `written to disk`, `uns['dft']` | diff --git a/matverse_guide/docs/tutorials/beyond_one_number.ipynb b/matverse_guide/docs/tutorials/beyond_one_number.ipynb index 3259c99..35da86b 100644 --- a/matverse_guide/docs/tutorials/beyond_one_number.ipynb +++ b/matverse_guide/docs/tutorials/beyond_one_number.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0f311cf2", + "id": "10ba58a7", "metadata": {}, "source": [ "# Beyond one number per material\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "f3e78770", + "id": "00ddfe50", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:37.044993Z", - "iopub.status.busy": "2026-08-05T21:18:37.044882Z", - "iopub.status.idle": "2026-08-05T21:18:43.435641Z", - "shell.execute_reply": "2026-08-05T21:18:43.435142Z" + "iopub.execute_input": "2026-08-06T04:55:05.473295Z", + "iopub.status.busy": "2026-08-06T04:55:05.472916Z", + "iopub.status.idle": "2026-08-06T04:55:15.941549Z", + "shell.execute_reply": "2026-08-06T04:55:15.941107Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "ab47d7c0", + "id": "46c3907b", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "23f7d5d5", + "id": "a7940cc7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.436855Z", - "iopub.status.busy": "2026-08-05T21:18:43.436516Z", - "iopub.status.idle": "2026-08-05T21:18:43.458888Z", - "shell.execute_reply": "2026-08-05T21:18:43.458542Z" + "iopub.execute_input": "2026-08-06T04:55:15.942947Z", + "iopub.status.busy": "2026-08-06T04:55:15.942369Z", + "iopub.status.idle": "2026-08-06T04:55:15.969557Z", + "shell.execute_reply": "2026-08-06T04:55:15.969230Z" } }, "outputs": [ @@ -218,7 +218,7 @@ }, { "cell_type": "markdown", - "id": "1bf17fa6", + "id": "f1d0a7c3", "metadata": {}, "source": [ "## Curves live in `obsm` on a shared grid\n", @@ -232,13 +232,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "f952ae2c", + "id": "47d6e2f4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.459644Z", - "iopub.status.busy": "2026-08-05T21:18:43.459551Z", - "iopub.status.idle": "2026-08-05T21:18:43.500935Z", - "shell.execute_reply": "2026-08-05T21:18:43.500549Z" + "iopub.execute_input": "2026-08-06T04:55:15.970384Z", + "iopub.status.busy": "2026-08-06T04:55:15.970235Z", + "iopub.status.idle": "2026-08-06T04:55:16.013058Z", + "shell.execute_reply": "2026-08-06T04:55:16.012726Z" } }, "outputs": [ @@ -261,7 +261,7 @@ }, { "cell_type": "markdown", - "id": "dcababdc", + "id": "6815bdf2", "metadata": {}, "source": [ "The block is named `'_'`, exactly like a scalar:\n", @@ -287,13 +287,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "04f3aa33", + "id": "b8f20261", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.501777Z", - "iopub.status.busy": "2026-08-05T21:18:43.501688Z", - "iopub.status.idle": "2026-08-05T21:18:43.503979Z", - "shell.execute_reply": "2026-08-05T21:18:43.503680Z" + "iopub.execute_input": "2026-08-06T04:55:16.013919Z", + "iopub.status.busy": "2026-08-06T04:55:16.013764Z", + "iopub.status.idle": "2026-08-06T04:55:16.016414Z", + "shell.execute_reply": "2026-08-06T04:55:16.016148Z" } }, "outputs": [ @@ -319,13 +319,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "9b726855", + "id": "7fc789ce", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.504668Z", - "iopub.status.busy": "2026-08-05T21:18:43.504584Z", - "iopub.status.idle": "2026-08-05T21:18:43.654101Z", - "shell.execute_reply": "2026-08-05T21:18:43.653781Z" + "iopub.execute_input": "2026-08-06T04:55:16.017152Z", + "iopub.status.busy": "2026-08-06T04:55:16.017017Z", + "iopub.status.idle": "2026-08-06T04:55:16.195341Z", + "shell.execute_reply": "2026-08-06T04:55:16.194941Z" } }, "outputs": [ @@ -362,7 +362,7 @@ }, { "cell_type": "markdown", - "id": "658f9aac", + "id": "7f85fe62", "metadata": {}, "source": [ "`mv.prop.rdf` is the other curve that ships, and it earns its place by doing\n", @@ -372,13 +372,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "f06e790b", + "id": "2b5dddd3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.655252Z", - "iopub.status.busy": "2026-08-05T21:18:43.655152Z", - "iopub.status.idle": "2026-08-05T21:18:43.809081Z", - "shell.execute_reply": "2026-08-05T21:18:43.808691Z" + "iopub.execute_input": "2026-08-06T04:55:16.196274Z", + "iopub.status.busy": "2026-08-06T04:55:16.196099Z", + "iopub.status.idle": "2026-08-06T04:55:16.361256Z", + "shell.execute_reply": "2026-08-06T04:55:16.360855Z" } }, "outputs": [ @@ -417,7 +417,7 @@ }, { "cell_type": "markdown", - "id": "cbb2c639", + "id": "d1568267", "metadata": {}, "source": [ "Two polymorphs have the same composition, so `X` cannot tell them apart and\n", @@ -438,13 +438,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "8cc3a6d7", + "id": "657fa483", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.809933Z", - "iopub.status.busy": "2026-08-05T21:18:43.809843Z", - "iopub.status.idle": "2026-08-05T21:18:43.813630Z", - "shell.execute_reply": "2026-08-05T21:18:43.813294Z" + "iopub.execute_input": "2026-08-06T04:55:16.362525Z", + "iopub.status.busy": "2026-08-06T04:55:16.362369Z", + "iopub.status.idle": "2026-08-06T04:55:16.367117Z", + "shell.execute_reply": "2026-08-06T04:55:16.366782Z" } }, "outputs": [ @@ -467,13 +467,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "e624a749", + "id": "c22f07bf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.814411Z", - "iopub.status.busy": "2026-08-05T21:18:43.814310Z", - "iopub.status.idle": "2026-08-05T21:18:43.820312Z", - "shell.execute_reply": "2026-08-05T21:18:43.820025Z" + "iopub.execute_input": "2026-08-06T04:55:16.367986Z", + "iopub.status.busy": "2026-08-06T04:55:16.367817Z", + "iopub.status.idle": "2026-08-06T04:55:16.374902Z", + "shell.execute_reply": "2026-08-06T04:55:16.374582Z" } }, "outputs": [ @@ -501,13 +501,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "5718b02a", + "id": "698e7a22", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.821023Z", - "iopub.status.busy": "2026-08-05T21:18:43.820935Z", - "iopub.status.idle": "2026-08-05T21:18:43.825066Z", - "shell.execute_reply": "2026-08-05T21:18:43.824743Z" + "iopub.execute_input": "2026-08-06T04:55:16.376899Z", + "iopub.status.busy": "2026-08-06T04:55:16.376736Z", + "iopub.status.idle": "2026-08-06T04:55:16.381681Z", + "shell.execute_reply": "2026-08-06T04:55:16.381373Z" } }, "outputs": [ @@ -622,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "e13f9473", + "id": "fdf340d9", "metadata": {}, "source": [ "One row per atom, with `obs['material']` pointing back at the parent. Per-atom\n", @@ -632,13 +632,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "efae5334", + "id": "3f459798", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.825742Z", - "iopub.status.busy": "2026-08-05T21:18:43.825658Z", - "iopub.status.idle": "2026-08-05T21:18:43.846957Z", - "shell.execute_reply": "2026-08-05T21:18:43.846657Z" + "iopub.execute_input": "2026-08-06T04:55:16.382512Z", + "iopub.status.busy": "2026-08-06T04:55:16.382350Z", + "iopub.status.idle": "2026-08-06T04:55:16.405333Z", + "shell.execute_reply": "2026-08-06T04:55:16.404990Z" } }, "outputs": [ @@ -662,13 +662,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "07889654", + "id": "ee2a7d85", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.847632Z", - "iopub.status.busy": "2026-08-05T21:18:43.847548Z", - "iopub.status.idle": "2026-08-05T21:18:43.852148Z", - "shell.execute_reply": "2026-08-05T21:18:43.851849Z" + "iopub.execute_input": "2026-08-06T04:55:16.406167Z", + "iopub.status.busy": "2026-08-06T04:55:16.406002Z", + "iopub.status.idle": "2026-08-06T04:55:16.411437Z", + "shell.execute_reply": "2026-08-06T04:55:16.411118Z" } }, "outputs": [ @@ -775,13 +775,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "4a7648fc", + "id": "25addaae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.852819Z", - "iopub.status.busy": "2026-08-05T21:18:43.852733Z", - "iopub.status.idle": "2026-08-05T21:18:43.941899Z", - "shell.execute_reply": "2026-08-05T21:18:43.941557Z" + "iopub.execute_input": "2026-08-06T04:55:16.412223Z", + "iopub.status.busy": "2026-08-06T04:55:16.412053Z", + "iopub.status.idle": "2026-08-06T04:55:16.510971Z", + "shell.execute_reply": "2026-08-06T04:55:16.510576Z" } }, "outputs": [ @@ -821,7 +821,7 @@ }, { "cell_type": "markdown", - "id": "67548138", + "id": "fc211ae9", "metadata": {}, "source": [ "One point per atom says which atoms are unrelaxed. The other question is what\n", @@ -833,13 +833,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "6a3a3ea1", + "id": "610bc9ec", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:43.942783Z", - "iopub.status.busy": "2026-08-05T21:18:43.942697Z", - "iopub.status.idle": "2026-08-05T21:18:44.120283Z", - "shell.execute_reply": "2026-08-05T21:18:44.119886Z" + "iopub.execute_input": "2026-08-06T04:55:16.511884Z", + "iopub.status.busy": "2026-08-06T04:55:16.511716Z", + "iopub.status.idle": "2026-08-06T04:55:16.731069Z", + "shell.execute_reply": "2026-08-06T04:55:16.730683Z" } }, "outputs": [ @@ -877,7 +877,7 @@ }, { "cell_type": "markdown", - "id": "cd835cc4", + "id": "ec7a94e6", "metadata": {}, "source": [ "Shared bins across the elements, which is the only way the two are being\n", @@ -888,7 +888,7 @@ }, { "cell_type": "markdown", - "id": "f1f5c49c", + "id": "ea06ed95", "metadata": {}, "source": [ "Twenty-six points where the material axis has room for seven — which is the\n", @@ -913,13 +913,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "f909225a", + "id": "c08ce0ef", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.121134Z", - "iopub.status.busy": "2026-08-05T21:18:44.121043Z", - "iopub.status.idle": "2026-08-05T21:18:44.125807Z", - "shell.execute_reply": "2026-08-05T21:18:44.125493Z" + "iopub.execute_input": "2026-08-06T04:55:16.731983Z", + "iopub.status.busy": "2026-08-06T04:55:16.731815Z", + "iopub.status.idle": "2026-08-06T04:55:16.737501Z", + "shell.execute_reply": "2026-08-06T04:55:16.737183Z" } }, "outputs": [ @@ -1012,7 +1012,7 @@ }, { "cell_type": "markdown", - "id": "66015aed", + "id": "a8950568", "metadata": {}, "source": [ "The largest force in each cell, on the material axis, where a screen can reach\n", @@ -1023,13 +1023,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "a9389526", + "id": "62181a59", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.126693Z", - "iopub.status.busy": "2026-08-05T21:18:44.126609Z", - "iopub.status.idle": "2026-08-05T21:18:44.131373Z", - "shell.execute_reply": "2026-08-05T21:18:44.131082Z" + "iopub.execute_input": "2026-08-06T04:55:16.738339Z", + "iopub.status.busy": "2026-08-06T04:55:16.738164Z", + "iopub.status.idle": "2026-08-06T04:55:16.743751Z", + "shell.execute_reply": "2026-08-06T04:55:16.743450Z" } }, "outputs": [ @@ -1129,7 +1129,7 @@ }, { "cell_type": "markdown", - "id": "896c0503", + "id": "e84f3a0c", "metadata": {}, "source": [ "The detail stays on the sites object where it can still be inspected; the\n", @@ -1145,13 +1145,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "d450899c", + "id": "3ccaccd1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.132099Z", - "iopub.status.busy": "2026-08-05T21:18:44.132018Z", - "iopub.status.idle": "2026-08-05T21:18:44.142449Z", - "shell.execute_reply": "2026-08-05T21:18:44.142146Z" + "iopub.execute_input": "2026-08-06T04:55:16.744555Z", + "iopub.status.busy": "2026-08-06T04:55:16.744398Z", + "iopub.status.idle": "2026-08-06T04:55:16.756179Z", + "shell.execute_reply": "2026-08-06T04:55:16.755868Z" } }, "outputs": [ @@ -1235,7 +1235,7 @@ }, { "cell_type": "markdown", - "id": "28618042", + "id": "489e56bd", "metadata": {}, "source": [ "That is `rank_genes_groups` answering \"which elements sit in the highest-force\n", @@ -1247,13 +1247,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "69d1d1b1", + "id": "1b6545ed", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.143141Z", - "iopub.status.busy": "2026-08-05T21:18:44.143059Z", - "iopub.status.idle": "2026-08-05T21:18:44.169782Z", - "shell.execute_reply": "2026-08-05T21:18:44.169478Z" + "iopub.execute_input": "2026-08-06T04:55:16.756962Z", + "iopub.status.busy": "2026-08-06T04:55:16.756806Z", + "iopub.status.idle": "2026-08-06T04:55:16.786999Z", + "shell.execute_reply": "2026-08-06T04:55:16.786653Z" } }, "outputs": [ @@ -1308,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "7cb28373", + "id": "7cb69d3a", "metadata": {}, "source": [ "Optional throughout. matverse's operations take `AnnData`, and the sites object\n", @@ -1319,13 +1319,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "8e729de3", + "id": "4cfebb94", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.170490Z", - "iopub.status.busy": "2026-08-05T21:18:44.170406Z", - "iopub.status.idle": "2026-08-05T21:18:44.461946Z", - "shell.execute_reply": "2026-08-05T21:18:44.461586Z" + "iopub.execute_input": "2026-08-06T04:55:16.787859Z", + "iopub.status.busy": "2026-08-06T04:55:16.787694Z", + "iopub.status.idle": "2026-08-06T04:55:17.089552Z", + "shell.execute_reply": "2026-08-06T04:55:17.089178Z" } }, "outputs": [ @@ -1434,7 +1434,7 @@ }, { "cell_type": "markdown", - "id": "9a4ea760", + "id": "969f6bad", "metadata": {}, "source": [ "A TEM pattern is spots on a plane, and a plane of spots does not compare across\n", @@ -1458,7 +1458,7 @@ }, { "cell_type": "markdown", - "id": "04b737ea", + "id": "dd901a7b", "metadata": {}, "source": [ "## A result computed somewhere else\n", @@ -1487,13 +1487,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "55b7a989", + "id": "859a0910", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.462946Z", - "iopub.status.busy": "2026-08-05T21:18:44.462857Z", - "iopub.status.idle": "2026-08-05T21:18:44.475652Z", - "shell.execute_reply": "2026-08-05T21:18:44.475251Z" + "iopub.execute_input": "2026-08-06T04:55:17.091329Z", + "iopub.status.busy": "2026-08-06T04:55:17.090884Z", + "iopub.status.idle": "2026-08-06T04:55:17.106412Z", + "shell.execute_reply": "2026-08-06T04:55:17.105797Z" } }, "outputs": [ @@ -1602,7 +1602,7 @@ }, { "cell_type": "markdown", - "id": "3033e5f1", + "id": "94194ff2", "metadata": {}, "source": [ "`sigma_iso` is 30, the trace over three. `zeta` is 30, which is\n", @@ -1624,13 +1624,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "9a985205", + "id": "62c8c00c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.476599Z", - "iopub.status.busy": "2026-08-05T21:18:44.476513Z", - "iopub.status.idle": "2026-08-05T21:18:44.492410Z", - "shell.execute_reply": "2026-08-05T21:18:44.492107Z" + "iopub.execute_input": "2026-08-06T04:55:17.107699Z", + "iopub.status.busy": "2026-08-06T04:55:17.107323Z", + "iopub.status.idle": "2026-08-06T04:55:17.126215Z", + "shell.execute_reply": "2026-08-06T04:55:17.125650Z" } }, "outputs": [ @@ -1725,7 +1725,7 @@ }, { "cell_type": "markdown", - "id": "82a73d8c", + "id": "fa05b854", "metadata": {}, "source": [ "The coupling constant is the only one of the three that needs to know which\n", @@ -1742,13 +1742,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "2dda1a76", + "id": "8fae6075", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.493321Z", - "iopub.status.busy": "2026-08-05T21:18:44.493231Z", - "iopub.status.idle": "2026-08-05T21:18:44.518529Z", - "shell.execute_reply": "2026-08-05T21:18:44.518179Z" + "iopub.execute_input": "2026-08-06T04:55:17.127475Z", + "iopub.status.busy": "2026-08-06T04:55:17.127101Z", + "iopub.status.idle": "2026-08-06T04:55:17.158110Z", + "shell.execute_reply": "2026-08-06T04:55:17.157491Z" } }, "outputs": [ @@ -1819,7 +1819,7 @@ }, { "cell_type": "markdown", - "id": "20b249d9", + "id": "4f80c3eb", "metadata": {}, "source": [ "**2.30 pC/N**, recovered from the tensor without being told where to look. For\n", @@ -1836,13 +1836,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "ebcc2896", + "id": "bbcfbf4a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.519447Z", - "iopub.status.busy": "2026-08-05T21:18:44.519360Z", - "iopub.status.idle": "2026-08-05T21:18:44.579617Z", - "shell.execute_reply": "2026-08-05T21:18:44.579286Z" + "iopub.execute_input": "2026-08-06T04:55:17.159388Z", + "iopub.status.busy": "2026-08-06T04:55:17.159005Z", + "iopub.status.idle": "2026-08-06T04:55:17.222087Z", + "shell.execute_reply": "2026-08-06T04:55:17.221456Z" } }, "outputs": [ @@ -1867,7 +1867,7 @@ }, { "cell_type": "markdown", - "id": "2bd60b8b", + "id": "ef9962fb", "metadata": {}, "source": [ "`False` — and a non-zero piezoelectric tensor on an fcc metal is an error in the\n", @@ -1885,13 +1885,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "3f0d5f8d", + "id": "6433c2ad", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.580386Z", - "iopub.status.busy": "2026-08-05T21:18:44.580295Z", - "iopub.status.idle": "2026-08-05T21:18:44.583921Z", - "shell.execute_reply": "2026-08-05T21:18:44.583616Z" + "iopub.execute_input": "2026-08-06T04:55:17.223451Z", + "iopub.status.busy": "2026-08-06T04:55:17.223050Z", + "iopub.status.idle": "2026-08-06T04:55:17.228838Z", + "shell.execute_reply": "2026-08-06T04:55:17.228290Z" } }, "outputs": [ @@ -1925,13 +1925,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "684f7b6e", + "id": "0038655a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.584592Z", - "iopub.status.busy": "2026-08-05T21:18:44.584509Z", - "iopub.status.idle": "2026-08-05T21:18:44.690756Z", - "shell.execute_reply": "2026-08-05T21:18:44.690400Z" + "iopub.execute_input": "2026-08-06T04:55:17.230091Z", + "iopub.status.busy": "2026-08-06T04:55:17.229718Z", + "iopub.status.idle": "2026-08-06T04:55:17.336501Z", + "shell.execute_reply": "2026-08-06T04:55:17.335843Z" } }, "outputs": [ @@ -2032,7 +2032,7 @@ }, { "cell_type": "markdown", - "id": "36344205", + "id": "b0bbb227", "metadata": {}, "source": [ "Read the first three rows against the last four.\n", @@ -2063,13 +2063,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "cef30230", + "id": "6fd61b30", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.691504Z", - "iopub.status.busy": "2026-08-05T21:18:44.691422Z", - "iopub.status.idle": "2026-08-05T21:18:44.791519Z", - "shell.execute_reply": "2026-08-05T21:18:44.791196Z" + "iopub.execute_input": "2026-08-06T04:55:17.337893Z", + "iopub.status.busy": "2026-08-06T04:55:17.337496Z", + "iopub.status.idle": "2026-08-06T04:55:17.442764Z", + "shell.execute_reply": "2026-08-06T04:55:17.442085Z" } }, "outputs": [ @@ -2144,7 +2144,7 @@ }, { "cell_type": "markdown", - "id": "c3d19977", + "id": "c348d453", "metadata": {}, "source": [ "That is the penalty silicon pays, and the reason a direct-gap absorber a tenth\n", @@ -2160,13 +2160,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "5b92ac68", + "id": "0fe31717", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.792232Z", - "iopub.status.busy": "2026-08-05T21:18:44.792148Z", - "iopub.status.idle": "2026-08-05T21:18:44.816385Z", - "shell.execute_reply": "2026-08-05T21:18:44.815994Z" + "iopub.execute_input": "2026-08-06T04:55:17.444148Z", + "iopub.status.busy": "2026-08-06T04:55:17.443759Z", + "iopub.status.idle": "2026-08-06T04:55:17.471692Z", + "shell.execute_reply": "2026-08-06T04:55:17.471064Z" } }, "outputs": [ @@ -2273,7 +2273,7 @@ }, { "cell_type": "markdown", - "id": "333a8e95", + "id": "4b13b8ea", "metadata": {}, "source": [ "Three numbers, three levels, one table, and nobody had to decide which one is\n", @@ -2284,13 +2284,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "0c6db480", + "id": "3ec4b7e0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.817223Z", - "iopub.status.busy": "2026-08-05T21:18:44.817141Z", - "iopub.status.idle": "2026-08-05T21:18:44.819178Z", - "shell.execute_reply": "2026-08-05T21:18:44.818878Z" + "iopub.execute_input": "2026-08-06T04:55:17.473029Z", + "iopub.status.busy": "2026-08-06T04:55:17.472628Z", + "iopub.status.idle": "2026-08-06T04:55:17.476330Z", + "shell.execute_reply": "2026-08-06T04:55:17.475787Z" } }, "outputs": [ @@ -2318,13 +2318,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "d0bc5e83", + "id": "cdb3e5dc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.819858Z", - "iopub.status.busy": "2026-08-05T21:18:44.819778Z", - "iopub.status.idle": "2026-08-05T21:18:44.912255Z", - "shell.execute_reply": "2026-08-05T21:18:44.911918Z" + "iopub.execute_input": "2026-08-06T04:55:17.477558Z", + "iopub.status.busy": "2026-08-06T04:55:17.477184Z", + "iopub.status.idle": "2026-08-06T04:55:17.578394Z", + "shell.execute_reply": "2026-08-06T04:55:17.577705Z" } }, "outputs": [ @@ -2350,7 +2350,7 @@ }, { "cell_type": "markdown", - "id": "8e7d75a4", + "id": "ea16091b", "metadata": {}, "source": [ "`mv.pl.parity` annotates the error and — the useful bit — prints a warning on\n", @@ -2367,13 +2367,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "59409cfb", + "id": "ee03d94d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.913079Z", - "iopub.status.busy": "2026-08-05T21:18:44.912996Z", - "iopub.status.idle": "2026-08-05T21:18:44.918851Z", - "shell.execute_reply": "2026-08-05T21:18:44.918543Z" + "iopub.execute_input": "2026-08-06T04:55:17.579820Z", + "iopub.status.busy": "2026-08-06T04:55:17.579398Z", + "iopub.status.idle": "2026-08-06T04:55:17.588139Z", + "shell.execute_reply": "2026-08-06T04:55:17.587538Z" } }, "outputs": [ @@ -2480,20 +2480,20 @@ { "cell_type": "code", "execution_count": 30, - "id": "b70d534d", + "id": "c5a69810", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:44.919783Z", - "iopub.status.busy": "2026-08-05T21:18:44.919701Z", - "iopub.status.idle": "2026-08-05T21:18:45.060568Z", - "shell.execute_reply": "2026-08-05T21:18:45.060249Z" + "iopub.execute_input": "2026-08-06T04:55:17.589423Z", + "iopub.status.busy": "2026-08-06T04:55:17.589044Z", + "iopub.status.idle": "2026-08-06T04:55:17.743688Z", + "shell.execute_reply": "2026-08-06T04:55:17.742973Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 30, @@ -2529,7 +2529,7 @@ }, { "cell_type": "markdown", - "id": "a1a16bd4", + "id": "c981db8d", "metadata": {}, "source": [ "Both patterns are baseline-shifted and unit-normalised before the dot product,\n", @@ -2540,13 +2540,13 @@ { "cell_type": "code", "execution_count": 31, - "id": "c6376696", + "id": "3081face", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.061680Z", - "iopub.status.busy": "2026-08-05T21:18:45.061592Z", - "iopub.status.idle": "2026-08-05T21:18:45.063693Z", - "shell.execute_reply": "2026-08-05T21:18:45.063399Z" + "iopub.execute_input": "2026-08-06T04:55:17.745420Z", + "iopub.status.busy": "2026-08-06T04:55:17.745015Z", + "iopub.status.idle": "2026-08-06T04:55:17.748726Z", + "shell.execute_reply": "2026-08-06T04:55:17.748226Z" } }, "outputs": [ @@ -2567,7 +2567,7 @@ }, { "cell_type": "markdown", - "id": "271e0f14", + "id": "baadb017", "metadata": {}, "source": [ "```{warning}\n", @@ -2586,13 +2586,13 @@ { "cell_type": "code", "execution_count": 32, - "id": "7c5993bc", + "id": "74abaafa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.064415Z", - "iopub.status.busy": "2026-08-05T21:18:45.064334Z", - "iopub.status.idle": "2026-08-05T21:18:45.070731Z", - "shell.execute_reply": "2026-08-05T21:18:45.070431Z" + "iopub.execute_input": "2026-08-06T04:55:17.749872Z", + "iopub.status.busy": "2026-08-06T04:55:17.749721Z", + "iopub.status.idle": "2026-08-06T04:55:17.757424Z", + "shell.execute_reply": "2026-08-06T04:55:17.756964Z" } }, "outputs": [ @@ -2701,7 +2701,7 @@ }, { "cell_type": "markdown", - "id": "5becc27d", + "id": "0c1d7ac5", "metadata": {}, "source": [ "Measurements are resampled onto the existing grid, because two curves on\n", @@ -2732,13 +2732,13 @@ { "cell_type": "code", "execution_count": 33, - "id": "8c6caac8", + "id": "09d44595", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.071428Z", - "iopub.status.busy": "2026-08-05T21:18:45.071346Z", - "iopub.status.idle": "2026-08-05T21:18:45.125302Z", - "shell.execute_reply": "2026-08-05T21:18:45.124993Z" + "iopub.execute_input": "2026-08-06T04:55:17.758642Z", + "iopub.status.busy": "2026-08-06T04:55:17.758491Z", + "iopub.status.idle": "2026-08-06T04:55:17.815268Z", + "shell.execute_reply": "2026-08-06T04:55:17.814892Z" } }, "outputs": [ @@ -2901,13 +2901,13 @@ { "cell_type": "code", "execution_count": 34, - "id": "a083d4c2", + "id": "39854e8e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.126229Z", - "iopub.status.busy": "2026-08-05T21:18:45.126146Z", - "iopub.status.idle": "2026-08-05T21:18:45.129539Z", - "shell.execute_reply": "2026-08-05T21:18:45.129213Z" + "iopub.execute_input": "2026-08-06T04:55:17.816760Z", + "iopub.status.busy": "2026-08-06T04:55:17.816633Z", + "iopub.status.idle": "2026-08-06T04:55:17.822036Z", + "shell.execute_reply": "2026-08-06T04:55:17.821518Z" } }, "outputs": [ @@ -2935,7 +2935,7 @@ }, { "cell_type": "markdown", - "id": "146626eb", + "id": "b13acf16", "metadata": {}, "source": [ "The fitted offsets should recover the ones put in — 0.10, −0.06 and 0.03:" @@ -2944,13 +2944,13 @@ { "cell_type": "code", "execution_count": 35, - "id": "606d437e", + "id": "d962d6fc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.130243Z", - "iopub.status.busy": "2026-08-05T21:18:45.130158Z", - "iopub.status.idle": "2026-08-05T21:18:45.132743Z", - "shell.execute_reply": "2026-08-05T21:18:45.132442Z" + "iopub.execute_input": "2026-08-06T04:55:17.823069Z", + "iopub.status.busy": "2026-08-06T04:55:17.822963Z", + "iopub.status.idle": "2026-08-06T04:55:17.826296Z", + "shell.execute_reply": "2026-08-06T04:55:17.825850Z" } }, "outputs": [ @@ -2977,13 +2977,13 @@ { "cell_type": "code", "execution_count": 36, - "id": "dbc34f90", + "id": "a0ecd378", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.133428Z", - "iopub.status.busy": "2026-08-05T21:18:45.133347Z", - "iopub.status.idle": "2026-08-05T21:18:45.301665Z", - "shell.execute_reply": "2026-08-05T21:18:45.301211Z" + "iopub.execute_input": "2026-08-06T04:55:17.827306Z", + "iopub.status.busy": "2026-08-06T04:55:17.827211Z", + "iopub.status.idle": "2026-08-06T04:55:18.027911Z", + "shell.execute_reply": "2026-08-06T04:55:18.027570Z" } }, "outputs": [ @@ -3020,7 +3020,7 @@ }, { "cell_type": "markdown", - "id": "8156b80e", + "id": "c7d64ade", "metadata": {}, "source": [ "Same materials, two databases, plotted against each other. Before, they scatter\n", @@ -3049,13 +3049,13 @@ { "cell_type": "code", "execution_count": 37, - "id": "4794e606", + "id": "8ad84078", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.302547Z", - "iopub.status.busy": "2026-08-05T21:18:45.302452Z", - "iopub.status.idle": "2026-08-05T21:18:45.317847Z", - "shell.execute_reply": "2026-08-05T21:18:45.317496Z" + "iopub.execute_input": "2026-08-06T04:55:18.028883Z", + "iopub.status.busy": "2026-08-06T04:55:18.028728Z", + "iopub.status.idle": "2026-08-06T04:55:18.044538Z", + "shell.execute_reply": "2026-08-06T04:55:18.044231Z" } }, "outputs": [ @@ -3165,13 +3165,13 @@ { "cell_type": "code", "execution_count": 38, - "id": "0d1a5730", + "id": "31ab5781", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.318690Z", - "iopub.status.busy": "2026-08-05T21:18:45.318596Z", - "iopub.status.idle": "2026-08-05T21:18:45.323957Z", - "shell.execute_reply": "2026-08-05T21:18:45.323632Z" + "iopub.execute_input": "2026-08-06T04:55:18.045406Z", + "iopub.status.busy": "2026-08-06T04:55:18.045257Z", + "iopub.status.idle": "2026-08-06T04:55:18.050947Z", + "shell.execute_reply": "2026-08-06T04:55:18.050649Z" } }, "outputs": [ @@ -3199,7 +3199,7 @@ }, { "cell_type": "markdown", - "id": "20921fda", + "id": "bfc3a953", "metadata": {}, "source": [ "Validity, uniqueness, novelty and stability use LeMat-GenBench's definitions\n", @@ -3209,13 +3209,13 @@ { "cell_type": "code", "execution_count": 39, - "id": "1421256d", + "id": "1257316e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.324708Z", - "iopub.status.busy": "2026-08-05T21:18:45.324619Z", - "iopub.status.idle": "2026-08-05T21:18:45.326699Z", - "shell.execute_reply": "2026-08-05T21:18:45.326378Z" + "iopub.execute_input": "2026-08-06T04:55:18.052046Z", + "iopub.status.busy": "2026-08-06T04:55:18.051890Z", + "iopub.status.idle": "2026-08-06T04:55:18.054128Z", + "shell.execute_reply": "2026-08-06T04:55:18.053873Z" } }, "outputs": [ @@ -3246,7 +3246,7 @@ }, { "cell_type": "markdown", - "id": "1d1917df", + "id": "4883c4ab", "metadata": {}, "source": [ "That matters more than it looks. Until those definitions were pinned, the same\n", @@ -3264,13 +3264,13 @@ { "cell_type": "code", "execution_count": 40, - "id": "747ea606", + "id": "fc514b5a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.327450Z", - "iopub.status.busy": "2026-08-05T21:18:45.327366Z", - "iopub.status.idle": "2026-08-05T21:18:45.329327Z", - "shell.execute_reply": "2026-08-05T21:18:45.328999Z" + "iopub.execute_input": "2026-08-06T04:55:18.054905Z", + "iopub.status.busy": "2026-08-06T04:55:18.054767Z", + "iopub.status.idle": "2026-08-06T04:55:18.056728Z", + "shell.execute_reply": "2026-08-06T04:55:18.056488Z" } }, "outputs": [ @@ -3291,7 +3291,7 @@ }, { "cell_type": "markdown", - "id": "4f6d3ab3", + "id": "10bd5d46", "metadata": {}, "source": [ "Novelty means \"absent from the reference set you named\", which is a weaker claim\n", @@ -3315,13 +3315,13 @@ { "cell_type": "code", "execution_count": 41, - "id": "5a27b6fa", + "id": "b0421f5b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:45.330087Z", - "iopub.status.busy": "2026-08-05T21:18:45.330005Z", - "iopub.status.idle": "2026-08-05T21:18:47.128949Z", - "shell.execute_reply": "2026-08-05T21:18:47.128566Z" + "iopub.execute_input": "2026-08-06T04:55:18.058394Z", + "iopub.status.busy": "2026-08-06T04:55:18.058248Z", + "iopub.status.idle": "2026-08-06T04:55:21.297979Z", + "shell.execute_reply": "2026-08-06T04:55:21.296949Z" } }, "outputs": [ @@ -3435,7 +3435,7 @@ }, { "cell_type": "markdown", - "id": "f9f3741d", + "id": "04e31f28", "metadata": {}, "source": [ "From LiFePO₄ it reaches **LiVPO₄** and **LiTiPO₄** — both real olivine\n", @@ -3452,13 +3452,13 @@ { "cell_type": "code", "execution_count": 42, - "id": "a43dd4f6", + "id": "dc86b713", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:47.129930Z", - "iopub.status.busy": "2026-08-05T21:18:47.129834Z", - "iopub.status.idle": "2026-08-05T21:18:47.790945Z", - "shell.execute_reply": "2026-08-05T21:18:47.790459Z" + "iopub.execute_input": "2026-08-06T04:55:21.299303Z", + "iopub.status.busy": "2026-08-06T04:55:21.299075Z", + "iopub.status.idle": "2026-08-06T04:55:21.981965Z", + "shell.execute_reply": "2026-08-06T04:55:21.981404Z" } }, "outputs": [ @@ -3521,7 +3521,7 @@ }, { "cell_type": "markdown", - "id": "803d3067", + "id": "16c93f93", "metadata": {}, "source": [ "Fluorine comes out as the n-type choice, which is the doping strategy LiFePO₄ is\n", @@ -3538,13 +3538,13 @@ { "cell_type": "code", "execution_count": 43, - "id": "e6fe0850", + "id": "74f7a2cd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:47.792077Z", - "iopub.status.busy": "2026-08-05T21:18:47.791973Z", - "iopub.status.idle": "2026-08-05T21:18:47.905133Z", - "shell.execute_reply": "2026-08-05T21:18:47.904777Z" + "iopub.execute_input": "2026-08-06T04:55:21.983167Z", + "iopub.status.busy": "2026-08-06T04:55:21.983035Z", + "iopub.status.idle": "2026-08-06T04:55:22.098003Z", + "shell.execute_reply": "2026-08-06T04:55:22.097574Z" } }, "outputs": [ @@ -3652,7 +3652,7 @@ }, { "cell_type": "markdown", - "id": "04dc0e86", + "id": "161a2da4", "metadata": {}, "source": [ "No calculator involved — the prediction comes from tabulated bond lengths — and\n", @@ -3670,13 +3670,13 @@ { "cell_type": "code", "execution_count": 44, - "id": "e0c52a7d", + "id": "08f53144", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:47.905949Z", - "iopub.status.busy": "2026-08-05T21:18:47.905860Z", - "iopub.status.idle": "2026-08-05T21:18:48.697073Z", - "shell.execute_reply": "2026-08-05T21:18:48.696643Z" + "iopub.execute_input": "2026-08-06T04:55:22.098982Z", + "iopub.status.busy": "2026-08-06T04:55:22.098855Z", + "iopub.status.idle": "2026-08-06T04:55:23.020197Z", + "shell.execute_reply": "2026-08-06T04:55:23.019576Z" } }, "outputs": [ @@ -3738,7 +3738,7 @@ }, { "cell_type": "markdown", - "id": "6868ca2b", + "id": "143752e4", "metadata": {}, "source": [ "From LiFePO₄ alone it builds **NaMnPO₄** — a real sodium-ion cathode — because\n", @@ -3763,7 +3763,7 @@ }, { "cell_type": "markdown", - "id": "e620ad84", + "id": "5bc68b16", "metadata": {}, "source": [ "## Why a material is piezoelectric, not just how much\n", @@ -3781,13 +3781,13 @@ { "cell_type": "code", "execution_count": 45, - "id": "fa140632", + "id": "2424df3c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.698235Z", - "iopub.status.busy": "2026-08-05T21:18:48.698145Z", - "iopub.status.idle": "2026-08-05T21:18:48.750300Z", - "shell.execute_reply": "2026-08-05T21:18:48.750000Z" + "iopub.execute_input": "2026-08-06T04:55:23.021574Z", + "iopub.status.busy": "2026-08-06T04:55:23.021408Z", + "iopub.status.idle": "2026-08-06T04:55:23.086918Z", + "shell.execute_reply": "2026-08-06T04:55:23.086512Z" } }, "outputs": [ @@ -3870,7 +3870,7 @@ }, { "cell_type": "markdown", - "id": "81f6f56c", + "id": "97d6897d", "metadata": {}, "source": [ "Doubling the Born charges doubles the response. Doubling the force constants\n", @@ -3894,7 +3894,7 @@ }, { "cell_type": "markdown", - "id": "69fbf006", + "id": "ae53dedc", "metadata": {}, "source": [ "## The polarization that is not a number\n", @@ -3916,13 +3916,13 @@ { "cell_type": "code", "execution_count": 46, - "id": "4671ce1f", + "id": "22af7677", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.751515Z", - "iopub.status.busy": "2026-08-05T21:18:48.751422Z", - "iopub.status.idle": "2026-08-05T21:18:48.759136Z", - "shell.execute_reply": "2026-08-05T21:18:48.758825Z" + "iopub.execute_input": "2026-08-06T04:55:23.087988Z", + "iopub.status.busy": "2026-08-06T04:55:23.087862Z", + "iopub.status.idle": "2026-08-06T04:55:23.097580Z", + "shell.execute_reply": "2026-08-06T04:55:23.097114Z" } }, "outputs": [ @@ -3956,7 +3956,7 @@ }, { "cell_type": "markdown", - "id": "3f203b35", + "id": "c47a18f7", "metadata": {}, "source": [ "Nothing about that sequence looks like a smooth ferroelectric switching path.\n", @@ -3970,13 +3970,13 @@ { "cell_type": "code", "execution_count": 47, - "id": "09f66505", + "id": "757134e6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.760031Z", - "iopub.status.busy": "2026-08-05T21:18:48.759872Z", - "iopub.status.idle": "2026-08-05T21:18:48.768189Z", - "shell.execute_reply": "2026-08-05T21:18:48.767866Z" + "iopub.execute_input": "2026-08-06T04:55:23.098484Z", + "iopub.status.busy": "2026-08-06T04:55:23.098379Z", + "iopub.status.idle": "2026-08-06T04:55:23.107710Z", + "shell.execute_reply": "2026-08-06T04:55:23.107235Z" } }, "outputs": [ @@ -4013,7 +4013,7 @@ }, { "cell_type": "markdown", - "id": "76694aef", + "id": "88183072", "metadata": {}, "source": [ "The smooth path, recovered exactly, and a spontaneous polarization of\n", @@ -4036,7 +4036,7 @@ }, { "cell_type": "markdown", - "id": "80f94832", + "id": "2023989e", "metadata": {}, "source": [ "## Corrections of your own\n", @@ -4054,13 +4054,13 @@ { "cell_type": "code", "execution_count": 48, - "id": "5cfc76f2", + "id": "6d5b2ec4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.769018Z", - "iopub.status.busy": "2026-08-05T21:18:48.768929Z", - "iopub.status.idle": "2026-08-05T21:18:48.805596Z", - "shell.execute_reply": "2026-08-05T21:18:48.805180Z" + "iopub.execute_input": "2026-08-06T04:55:23.108706Z", + "iopub.status.busy": "2026-08-06T04:55:23.108575Z", + "iopub.status.idle": "2026-08-06T04:55:23.150533Z", + "shell.execute_reply": "2026-08-06T04:55:23.149964Z" } }, "outputs": [ @@ -4105,7 +4105,7 @@ }, { "cell_type": "markdown", - "id": "777a94ea", + "id": "ef316a3e", "metadata": {}, "source": [ "**−0.45 eV per oxygen, recovered to four decimals**, with an error bar beside\n", @@ -4116,13 +4116,13 @@ { "cell_type": "code", "execution_count": 49, - "id": "9d1b9d20", + "id": "88e5c2d9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.806588Z", - "iopub.status.busy": "2026-08-05T21:18:48.806498Z", - "iopub.status.idle": "2026-08-05T21:18:48.811149Z", - "shell.execute_reply": "2026-08-05T21:18:48.810821Z" + "iopub.execute_input": "2026-08-06T04:55:23.151804Z", + "iopub.status.busy": "2026-08-06T04:55:23.151429Z", + "iopub.status.idle": "2026-08-06T04:55:23.168440Z", + "shell.execute_reply": "2026-08-06T04:55:23.167962Z" } }, "outputs": [ @@ -4194,7 +4194,7 @@ }, { "cell_type": "markdown", - "id": "a65e1d31", + "id": "0e1803e3", "metadata": {}, "source": [ "```{warning}\n", @@ -4217,7 +4217,7 @@ }, { "cell_type": "markdown", - "id": "790ea5cb", + "id": "14eadfcb", "metadata": {}, "source": [ "## A hull the laboratory built\n", @@ -4234,13 +4234,13 @@ { "cell_type": "code", "execution_count": 50, - "id": "8eb130e2", + "id": "bcec3cb3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.811925Z", - "iopub.status.busy": "2026-08-05T21:18:48.811841Z", - "iopub.status.idle": "2026-08-05T21:18:48.826134Z", - "shell.execute_reply": "2026-08-05T21:18:48.825822Z" + "iopub.execute_input": "2026-08-06T04:55:23.169815Z", + "iopub.status.busy": "2026-08-06T04:55:23.169682Z", + "iopub.status.idle": "2026-08-06T04:55:23.188644Z", + "shell.execute_reply": "2026-08-06T04:55:23.187928Z" } }, "outputs": [ @@ -4341,7 +4341,7 @@ }, { "cell_type": "markdown", - "id": "96f28e53", + "id": "4e9a979b", "metadata": {}, "source": [ "Hematite and magnetite sit on the hull. **Wüstite sits 0.039 eV/atom above it**\n", @@ -4370,13 +4370,13 @@ { "cell_type": "code", "execution_count": 51, - "id": "216b2c2c", + "id": "5a2778e8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.827198Z", - "iopub.status.busy": "2026-08-05T21:18:48.827111Z", - "iopub.status.idle": "2026-08-05T21:18:48.829142Z", - "shell.execute_reply": "2026-08-05T21:18:48.828850Z" + "iopub.execute_input": "2026-08-06T04:55:23.189694Z", + "iopub.status.busy": "2026-08-06T04:55:23.189578Z", + "iopub.status.idle": "2026-08-06T04:55:23.193057Z", + "shell.execute_reply": "2026-08-06T04:55:23.192501Z" } }, "outputs": [ @@ -4397,7 +4397,7 @@ }, { "cell_type": "markdown", - "id": "127184df", + "id": "f147e130", "metadata": {}, "source": [ "Now the comparison this was for. Run `mv.thermo.hull` at a computed level on the\n", @@ -4408,7 +4408,7 @@ }, { "cell_type": "markdown", - "id": "0c32ef19", + "id": "72759865", "metadata": {}, "source": [ "## A hull is not a phase diagram\n", @@ -4426,13 +4426,13 @@ { "cell_type": "code", "execution_count": 52, - "id": "cf727627", + "id": "8041ec7c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:48.829852Z", - "iopub.status.busy": "2026-08-05T21:18:48.829770Z", - "iopub.status.idle": "2026-08-05T21:18:49.221217Z", - "shell.execute_reply": "2026-08-05T21:18:49.220509Z" + "iopub.execute_input": "2026-08-06T04:55:23.194126Z", + "iopub.status.busy": "2026-08-06T04:55:23.194016Z", + "iopub.status.idle": "2026-08-06T04:55:23.622789Z", + "shell.execute_reply": "2026-08-06T04:55:23.622099Z" } }, "outputs": [ @@ -4475,7 +4475,7 @@ }, { "cell_type": "markdown", - "id": "f05c007c", + "id": "92233e55", "metadata": {}, "source": [ "The Pb-Sn eutectic is measured at **456 K**, and those two temperatures\n", @@ -4496,6 +4496,391 @@ "from PbSnCu and renormalising would answer a question about a different alloy.\n", "```" ] + }, + { + "cell_type": "markdown", + "id": "fb48d06d", + "metadata": {}, + "source": [ + "## A voltage is a slope on the hull\n", + "\n", + "`mv.thermo.hull` already computes the energies an intercalation voltage is made\n", + "of. The voltage *is* the hull slope along the working-ion axis:\n", + "\n", + "$$V = -\\frac{E_{\\mathrm{lithiated}} - E_{\\mathrm{delithiated}} - n\\,E_{\\mathrm{Li}}}{n}$$\n", + "\n", + "in volts, because an electron carries one. `mv.thermo.voltage` reads it off." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "96bad538", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:23.624164Z", + "iopub.status.busy": "2026-08-06T04:55:23.623749Z", + "iopub.status.idle": "2026-08-06T04:55:26.406794Z", + "shell.execute_reply": "2026-08-06T04:55:26.406175Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHGNet v0.3.0 initialized with 412,525 parameters\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHGNet will run on cuda\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHGNet v0.3.0 initialized with 412,525 parameters\n", + "CHGNet will run on cuda\n", + " voltage_chgnet capacity_gravimetric_chgnet energy_density_chgnet\n", + "LiFePO4 3.5 169.89 594.03\n" + ] + } + ], + "source": [ + "from pymatgen.core import Lattice, Structure\n", + "\n", + "cathode = mv.datasets.load(\"battery_cathodes\")[:1].copy()\n", + "lithiated = mv.structures(cathode, \"input\")[0]\n", + "delithiated = lithiated.copy()\n", + "delithiated.remove_species([\"Li\"])\n", + "\n", + "electrode = mv.data.from_structures([lithiated, delithiated])\n", + "electrode.obs_names = [\"LiFePO4\", \"FePO4\"]\n", + "metal = mv.data.from_structures([Structure(\n", + " Lattice.cubic(3.51), [\"Li\", \"Li\"], [[0, 0, 0], [.5, .5, .5]])])\n", + "\n", + "try:\n", + " # cell=False on purpose: see the warning below.\n", + " for piece in (electrode, metal):\n", + " mv.calc.relax(piece, level=\"chgnet\", fmax=0.05, cell=False)\n", + " mv.thermo.voltage(electrode, working_ion=\"Li\", level=\"chgnet\",\n", + " source=\"relaxed_chgnet\", reference=metal)\n", + " print(electrode.obs[[\"voltage_chgnet\", \"capacity_gravimetric_chgnet\",\n", + " \"energy_density_chgnet\"]].round(2).head(1).to_string())\n", + "except (ImportError, KeyError) as exc:\n", + " print(\"needs CHGNet; pip install matverse[potentials]\", exc)" + ] + }, + { + "cell_type": "markdown", + "id": "0ac7f92f", + "metadata": {}, + "source": [ + "**3.50 V and 169.9 mAh/g**, against a measured plateau of 3.4–3.5 V and a\n", + "theoretical capacity of 170. CHGNet is trained on PBE+U, which is the\n", + "functional this problem needs — plain PBE gives closer to 3.0 V for the same\n", + "material, and `level=` is what records which was used.\n", + "\n", + "```{warning}\n", + "`cell=False` is not incidental. Relaxing the **cell** of these structures with a\n", + "foundation potential diverges: it collapsed LiFePO₄ to 2 ų per atom and\n", + "expanded FePO₄ to 117, and the first version of `mv.thermo.voltage` read the\n", + "resulting energies and returned **78 V**. `mv.calc.relax` had recorded\n", + "`relax_converged_chgnet = False` for both rows the whole time — the diagnostic\n", + "existed and the function did not consult it.\n", + "\n", + "It does now: unconverged rows are excluded and counted, and an unconverged\n", + "**reference** raises outright, because a bad lithium-metal energy shifts every\n", + "voltage by the same amount and no comparison between cathodes would reveal it.\n", + "```\n", + "\n", + "`obs['volume_change_chgnet']` is the weakest number of the set — about −14%\n", + "here against a measured −6.8%, precisely because the cell was held fixed and\n", + "never allowed to respond to delithiation. It is a flag, not a measurement." + ] + }, + { + "cell_type": "markdown", + "id": "31d700d3", + "metadata": {}, + "source": [ + "### The cheaper question, asked first\n", + "\n", + "A voltage needs both ends of the reaction. `mv.thermo.theoretical_capacity`\n", + "needs **one structure** and counts the electrons the transition metals could\n", + "give up — which is the question a screen asks first, and much more cheaply." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "4f40f540", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:26.408185Z", + "iopub.status.busy": "2026-08-06T04:55:26.407772Z", + "iopub.status.idle": "2026-08-06T04:55:26.500063Z", + "shell.execute_reply": "2026-08-06T04:55:26.499497Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " theoretical_capacity_Li theoretical_capacity_Na\n", + "0 169.9 0.0\n", + "1 0.0 154.2\n", + "2 317.9 118.2\n" + ] + } + ], + "source": [ + "library = mv.datasets.load(\"battery_cathodes\")\n", + "mv.thermo.theoretical_capacity(library, working_ion=\"Li\")\n", + "mv.thermo.theoretical_capacity(library, working_ion=\"Na\")\n", + "print(library.obs[[\"theoretical_capacity_Li\",\n", + " \"theoretical_capacity_Na\"]].round(1).to_string())" + ] + }, + { + "cell_type": "markdown", + "id": "8d32733b", + "metadata": {}, + "source": [ + "LiFePO₄ gives 169.9 mAh/g for lithium and zero for sodium; NaFePO₄ gives 154.2\n", + "for sodium — the measured figure is about 154 — and zero for lithium. Asking a\n", + "lithium compound how much sodium it can release is answered correctly rather\n", + "than approximately.\n", + "\n", + "It is a **bound**, not a prediction. The number counts electrons and says\n", + "nothing about whether the framework survives losing them; a material that\n", + "collapses at half this will report the same figure. Rank a library on it, then\n", + "compute voltages for the survivors — that is the order that costs least." + ] + }, + { + "cell_type": "markdown", + "id": "a0af58cf", + "metadata": {}, + "source": [ + "## Three numbers where matverse has one and a half\n", + "\n", + "Some quantities are a formula over inputs matverse cannot produce, and the\n", + "useful thing is to be exact about which half is which.\n", + "\n", + "`mv.prop.superconductivity` computes ω_log — a moment of the phonon density of\n", + "states `mv.prop.phonon` already produced — and then applies Allen-Dynes. It\n", + "**will not** guess the electron–phonon coupling λ, which is an integral over\n", + "α²F and needs EPW or `ph.x`, not a phonon spectrum." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "1c663eb0", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:26.501350Z", + "iopub.status.busy": "2026-08-06T04:55:26.500940Z", + "iopub.status.idle": "2026-08-06T04:55:29.518193Z", + "shell.execute_reply": "2026-08-06T04:55:29.517684Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name omega_log_emt critical_temperature_emt\n", + " Cu 4.824 14.556\n", + " Al 4.882 14.743\n", + "\n", + "without a coupling: coupling= (the electron-phonon constant lambda) is required and has no...\n" + ] + } + ], + "source": [ + "metals = mv.datasets.metals([\"Cu\", \"Al\"])\n", + "mv.pp.describe(metals)\n", + "mv.calc.relax(metals, level=\"emt\", fmax=0.01)\n", + "mv.prop.phonon(metals, level=\"emt\", source=\"relaxed_emt\", supercell=(2, 2, 2))\n", + "\n", + "mv.prop.superconductivity(metals, level=\"emt\", coupling=1.0)\n", + "print(metals.obs[[\"name\", \"omega_log_emt\", \"critical_temperature_emt\"]]\n", + " .round(3).to_string(index=False))\n", + "\n", + "try:\n", + " mv.prop.superconductivity(metals, level=\"emt\")\n", + "except ValueError as exc:\n", + " print(f\"\\nwithout a coupling: {str(exc)[:70]}...\")" + ] + }, + { + "cell_type": "markdown", + "id": "b06a5e4d", + "metadata": {}, + "source": [ + "λ = 1.0 there was **supplied, not computed**, so the temperatures are what that\n", + "coupling would imply and not a prediction about copper — whose real λ is about\n", + "0.13, below the threshold where the formula has a solution at all, and which is\n", + "not a superconductor.\n", + "\n", + "ω_log is the computed half and is checkable: a density of states with all its\n", + "weight at one frequency returns that frequency exactly, and one with equal\n", + "weight at 4 and 16 THz returns 5.28 rather than the geometric mean of 8, because\n", + "the 1/ω weighting favours the soft end.\n", + "\n", + "```{note}\n", + "ω_log is properly a moment of α²F, not of the phonon density of states. Using\n", + "the latter assumes the coupling does not depend on frequency — the Einstein-like\n", + "limit, wrong wherever one branch couples much more strongly than another, which\n", + "is most interesting superconductors. `uns` records that the substitution was\n", + "made.\n", + "```\n", + "\n", + "### The same shape, for thermoelectrics\n", + "\n", + "`mv.elec.transport` produces σ/τ rather than σ, because the constant relaxation\n", + "time approximation declines to supply τ. So `mv.prop.zt` requires it — and\n", + "computes, separately, the one number that does not need it." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "ceaab9ae", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:29.519434Z", + "iopub.status.busy": "2026-08-06T04:55:29.519300Z", + "iopub.status.idle": "2026-08-06T04:55:29.540423Z", + "shell.execute_reply": "2026-08-06T04:55:29.539978Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sigma/tau=1e+17 zT=0.0275 ceiling=1.6393\n", + "sigma/tau=1e+19 zT=1.0340 ceiling=1.6393\n", + "sigma/tau=1e+22 zT=1.6384 ceiling=1.6393\n" + ] + } + ], + "source": [ + "thermo = mv.data.from_compositions([\"Bi2Te3\"])\n", + "thermo.obs[\"seebeck_x\"] = [200e-6] # V/K\n", + "thermo.obs[\"thermal_conductivity_x\"] = [1.0] # W/m/K\n", + "\n", + "for sigma_over_tau in (1e17, 1e19, 1e22):\n", + " row = thermo.copy()\n", + " row.obs[\"sigma_over_tau_x\"] = [sigma_over_tau]\n", + " mv.prop.zt(row, level=\"x\", relaxation_time=1e-14, temperature=700.0)\n", + " print(f\"sigma/tau={sigma_over_tau:.0e} \"\n", + " f\"zT={float(row.obs['zt_x'].iloc[0]):.4f} \"\n", + " f\"ceiling={float(row.obs['zt_ceiling_x'].iloc[0]):.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e9e504cc", + "metadata": {}, + "source": [ + "zT climbs with conductivity and **stops** at 1.639. That ceiling is `S²/L`, and\n", + "τ cancels out of it exactly: it appears in σ and again in the electronic thermal\n", + "conductivity through Wiedemann–Franz, so as the lattice term stops mattering the\n", + "unknown divides out.\n", + "\n", + "The consequence is worth stating plainly. **A material whose Seebeck coefficient\n", + "puts its ceiling below the zT you need cannot be rescued by any conductivity** —\n", + "and that conclusion survives not knowing τ, which is the number nobody has.\n", + "\n", + "## Scaling relations, and why a reaction has a ceiling\n", + "\n", + "Adsorbates that bind through the same atom bind in proportion. That is why a\n", + "screen over a whole reaction can run on one descriptor — and why the reaction\n", + "has a ceiling, because the intermediate you want bound weakly is tied to the one\n", + "you want bound strongly." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "1c779141", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:55:29.541471Z", + "iopub.status.busy": "2026-08-06T04:55:29.541352Z", + "iopub.status.idle": "2026-08-06T04:55:29.567117Z", + "shell.execute_reply": "2026-08-06T04:55:29.564593Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "slope 0.506 intercept -0.087 eV R2 0.9997\n", + " E_O scaling_residual distance_from_optimum volcano_activity\n", + "0 -2.500 0.005 -0.900 -0.900\n", + "1 -2.071 -0.003 -0.471 -0.471\n", + "2 -1.643 0.010 -0.043 -0.043\n", + "3 -1.214 -0.004 0.386 -0.386\n", + "4 -0.786 -0.019 0.814 -0.814\n", + "5 -0.357 -0.004 1.243 -1.243\n", + "6 0.071 0.012 1.671 -1.671\n", + "7 0.500 0.002 2.100 -2.100\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "rng = np.random.default_rng(0)\n", + "oxygen = np.linspace(-2.5, 0.5, 8)\n", + "surfaces = mv.data.from_compositions([f\"Pt{i + 1}\" for i in range(8)])\n", + "surfaces.obs[\"E_O\"] = oxygen\n", + "surfaces.obs[\"E_OH\"] = 0.5 * oxygen - 0.10 + rng.normal(0, 0.02, 8)\n", + "\n", + "mv.surf.scaling(surfaces, x=\"E_O\", y=\"E_OH\")\n", + "fit = surfaces.uns[\"scaling\"][\"fits\"][\"all\"]\n", + "print(f\"slope {fit['slope']:.3f} intercept {fit['intercept_eV']:.3f} eV \"\n", + " f\"R2 {fit['r_squared']:.4f}\")\n", + "\n", + "mv.surf.volcano(surfaces, descriptor=\"E_O\", optimum=-1.6)\n", + "print(surfaces.obs[[\"E_O\", \"scaling_residual\", \"distance_from_optimum\",\n", + " \"volcano_activity\"]].round(3).to_string())" + ] + }, + { + "cell_type": "markdown", + "id": "d6ebbfa6", + "metadata": {}, + "source": [ + "The slope is the physical claim: a species bonding through one atom with *n*\n", + "remaining valences scales against a reference with *m* as roughly *n/m*, so OH\n", + "against O is about ½. A fitted slope far from a small rational number usually\n", + "means the two species are not binding the way the argument assumes.\n", + "\n", + "`scaling_residual` is the interesting column, not the fit. A catalyst that beats\n", + "the scaling ceiling has to **break** the relation, so a large residual is a\n", + "candidate and a small one confirms the surface offers nothing new.\n", + "\n", + "```{warning}\n", + "The volcano's **optimum is an input**. Where the peak sits depends on the\n", + "reaction, the potential and the conditions, and it comes from a microkinetic\n", + "model or an experiment — not from here. `volcano_activity` is in arbitrary units\n", + "and only its ordering means anything; `distance_from_optimum` is in eV and\n", + "signed, so it says which side a surface falls on. Binding too weakly and too\n", + "strongly are different problems and a magnitude cannot tell them apart.\n", + "```" + ] } ], "metadata": { diff --git a/matverse_guide/docs/tutorials/chemical_space.ipynb b/matverse_guide/docs/tutorials/chemical_space.ipynb index fbb9163..918e799 100644 --- a/matverse_guide/docs/tutorials/chemical_space.ipynb +++ b/matverse_guide/docs/tutorials/chemical_space.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "b626ae57", + "id": "c865085c", "metadata": {}, "source": [ "# Chemical space\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "ea0f72e0", + "id": "ccd72352", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:24.211310Z", - "iopub.status.busy": "2026-08-05T21:18:24.211185Z", - "iopub.status.idle": "2026-08-05T21:18:30.376090Z", - "shell.execute_reply": "2026-08-05T21:18:30.375605Z" + "iopub.execute_input": "2026-08-06T04:54:34.643622Z", + "iopub.status.busy": "2026-08-06T04:54:34.643546Z", + "iopub.status.idle": "2026-08-06T04:54:52.212744Z", + "shell.execute_reply": "2026-08-06T04:54:52.212267Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "d4f0bfde", + "id": "45da3093", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "92338636", + "id": "18f7d459", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:30.377409Z", - "iopub.status.busy": "2026-08-05T21:18:30.376909Z", - "iopub.status.idle": "2026-08-05T21:18:31.073405Z", - "shell.execute_reply": "2026-08-05T21:18:31.072958Z" + "iopub.execute_input": "2026-08-06T04:54:52.214503Z", + "iopub.status.busy": "2026-08-06T04:54:52.213751Z", + "iopub.status.idle": "2026-08-06T04:54:55.054706Z", + "shell.execute_reply": "2026-08-06T04:54:55.054149Z" } }, "outputs": [ @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "62212b72", + "id": "dd881fbc", "metadata": {}, "source": [ "## Why elements are the right axis\n", @@ -243,13 +243,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "9c3b577d", + "id": "92afe5da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.074286Z", - "iopub.status.busy": "2026-08-05T21:18:31.074177Z", - "iopub.status.idle": "2026-08-05T21:18:31.079071Z", - "shell.execute_reply": "2026-08-05T21:18:31.078715Z" + "iopub.execute_input": "2026-08-06T04:54:55.056314Z", + "iopub.status.busy": "2026-08-06T04:54:55.056171Z", + "iopub.status.idle": "2026-08-06T04:54:55.062812Z", + "shell.execute_reply": "2026-08-06T04:54:55.062191Z" } }, "outputs": [ @@ -355,7 +355,7 @@ }, { "cell_type": "markdown", - "id": "53326cab", + "id": "ca11ee22", "metadata": {}, "source": [ "Counts come from the **reduced** formula, so a supercell and its primitive cell\n", @@ -369,13 +369,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "8ccbceba", + "id": "2063097b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.079818Z", - "iopub.status.busy": "2026-08-05T21:18:31.079733Z", - "iopub.status.idle": "2026-08-05T21:18:31.084238Z", - "shell.execute_reply": "2026-08-05T21:18:31.083898Z" + "iopub.execute_input": "2026-08-06T04:54:55.063855Z", + "iopub.status.busy": "2026-08-06T04:54:55.063760Z", + "iopub.status.idle": "2026-08-06T04:54:55.069747Z", + "shell.execute_reply": "2026-08-06T04:54:55.069339Z" } }, "outputs": [ @@ -458,7 +458,7 @@ }, { "cell_type": "markdown", - "id": "f5e886b4", + "id": "afdbb89d", "metadata": {}, "source": [ "```{note}\n", @@ -472,13 +472,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "214e1a06", + "id": "a94b1314", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.084940Z", - "iopub.status.busy": "2026-08-05T21:18:31.084854Z", - "iopub.status.idle": "2026-08-05T21:18:31.089030Z", - "shell.execute_reply": "2026-08-05T21:18:31.088695Z" + "iopub.execute_input": "2026-08-06T04:54:55.070827Z", + "iopub.status.busy": "2026-08-06T04:54:55.070667Z", + "iopub.status.idle": "2026-08-06T04:54:55.075492Z", + "shell.execute_reply": "2026-08-06T04:54:55.075087Z" } }, "outputs": [ @@ -549,7 +549,7 @@ }, { "cell_type": "markdown", - "id": "2bcae29b", + "id": "e3389f27", "metadata": {}, "source": [ "## The dividend inside the library\n", @@ -563,13 +563,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "33df6173", + "id": "f8188158", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.089724Z", - "iopub.status.busy": "2026-08-05T21:18:31.089636Z", - "iopub.status.idle": "2026-08-05T21:18:31.092901Z", - "shell.execute_reply": "2026-08-05T21:18:31.092577Z" + "iopub.execute_input": "2026-08-06T04:54:55.076566Z", + "iopub.status.busy": "2026-08-06T04:54:55.076420Z", + "iopub.status.idle": "2026-08-06T04:54:55.080226Z", + "shell.execute_reply": "2026-08-06T04:54:55.079823Z" } }, "outputs": [ @@ -591,7 +591,7 @@ }, { "cell_type": "markdown", - "id": "c20a296a", + "id": "1fb48c3b", "metadata": {}, "source": [ "Check one by hand. For Al₃Cu the weighted mean electronegativity should be\n", @@ -601,13 +601,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "896de1d0", + "id": "f34a6843", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.093573Z", - "iopub.status.busy": "2026-08-05T21:18:31.093487Z", - "iopub.status.idle": "2026-08-05T21:18:31.095864Z", - "shell.execute_reply": "2026-08-05T21:18:31.095535Z" + "iopub.execute_input": "2026-08-06T04:54:55.081099Z", + "iopub.status.busy": "2026-08-06T04:54:55.080940Z", + "iopub.status.idle": "2026-08-06T04:54:55.083631Z", + "shell.execute_reply": "2026-08-06T04:54:55.083208Z" } }, "outputs": [ @@ -632,7 +632,7 @@ }, { "cell_type": "markdown", - "id": "7e567419", + "id": "efb1620e", "metadata": {}, "source": [ "Those descriptors are also a distance, which makes the library a matrix you can\n", @@ -642,20 +642,20 @@ { "cell_type": "code", "execution_count": 8, - "id": "e227ca76", + "id": "c3180ca5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.096531Z", - "iopub.status.busy": "2026-08-05T21:18:31.096444Z", - "iopub.status.idle": "2026-08-05T21:18:31.256633Z", - "shell.execute_reply": "2026-08-05T21:18:31.256211Z" + "iopub.execute_input": "2026-08-06T04:54:55.084576Z", + "iopub.status.busy": "2026-08-06T04:54:55.084433Z", + "iopub.status.idle": "2026-08-06T04:54:55.255678Z", + "shell.execute_reply": "2026-08-06T04:54:55.255162Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -694,7 +694,7 @@ }, { "cell_type": "markdown", - "id": "03a42336", + "id": "c48758da", "metadata": {}, "source": [ "The two Al–Cu orderings sit next to each other and the elementals separate,\n", @@ -712,13 +712,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "403c3b94", + "id": "28a7271d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.257537Z", - "iopub.status.busy": "2026-08-05T21:18:31.257415Z", - "iopub.status.idle": "2026-08-05T21:18:31.260035Z", - "shell.execute_reply": "2026-08-05T21:18:31.259696Z" + "iopub.execute_input": "2026-08-06T04:54:55.256852Z", + "iopub.status.busy": "2026-08-06T04:54:55.256680Z", + "iopub.status.idle": "2026-08-06T04:54:55.270594Z", + "shell.execute_reply": "2026-08-06T04:54:55.270270Z" } }, "outputs": [ @@ -744,7 +744,7 @@ }, { "cell_type": "markdown", - "id": "94bcfa5f", + "id": "00b9f2d8", "metadata": {}, "source": [ "A site-averaged SOAP vector per structure, which separates two polymorphs of\n", @@ -767,13 +767,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "c28f6954", + "id": "ab69c231", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.260739Z", - "iopub.status.busy": "2026-08-05T21:18:31.260653Z", - "iopub.status.idle": "2026-08-05T21:18:31.266219Z", - "shell.execute_reply": "2026-08-05T21:18:31.265875Z" + "iopub.execute_input": "2026-08-06T04:54:55.271529Z", + "iopub.status.busy": "2026-08-06T04:54:55.271375Z", + "iopub.status.idle": "2026-08-06T04:54:55.283835Z", + "shell.execute_reply": "2026-08-06T04:54:55.283495Z" } }, "outputs": [ @@ -886,13 +886,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "a333b4a5", + "id": "ede0399c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.266913Z", - "iopub.status.busy": "2026-08-05T21:18:31.266824Z", - "iopub.status.idle": "2026-08-05T21:18:31.268842Z", - "shell.execute_reply": "2026-08-05T21:18:31.268534Z" + "iopub.execute_input": "2026-08-06T04:54:55.284750Z", + "iopub.status.busy": "2026-08-06T04:54:55.284595Z", + "iopub.status.idle": "2026-08-06T04:54:55.287674Z", + "shell.execute_reply": "2026-08-06T04:54:55.287355Z" } }, "outputs": [ @@ -915,7 +915,7 @@ }, { "cell_type": "markdown", - "id": "d23b2a69", + "id": "dc985209", "metadata": {}, "source": [ "Which model produced the block, and under what licence, is recorded next to it\n", @@ -937,13 +937,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "978b5963", + "id": "edde99b7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.269494Z", - "iopub.status.busy": "2026-08-05T21:18:31.269413Z", - "iopub.status.idle": "2026-08-05T21:18:31.537680Z", - "shell.execute_reply": "2026-08-05T21:18:31.537314Z" + "iopub.execute_input": "2026-08-06T04:54:55.288614Z", + "iopub.status.busy": "2026-08-06T04:54:55.288465Z", + "iopub.status.idle": "2026-08-06T04:54:57.607348Z", + "shell.execute_reply": "2026-08-06T04:54:57.606810Z" } }, "outputs": [ @@ -1039,7 +1039,7 @@ }, { "cell_type": "markdown", - "id": "d3d7e3a2", + "id": "0b2321a5", "metadata": {}, "source": [ "`normalize_composition` writes atomic fractions to a **layer** rather than\n", @@ -1055,13 +1055,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "d259ec2e", + "id": "6ac19ab0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.538591Z", - "iopub.status.busy": "2026-08-05T21:18:31.538500Z", - "iopub.status.idle": "2026-08-05T21:18:31.659629Z", - "shell.execute_reply": "2026-08-05T21:18:31.659172Z" + "iopub.execute_input": "2026-08-06T04:54:57.608830Z", + "iopub.status.busy": "2026-08-06T04:54:57.608638Z", + "iopub.status.idle": "2026-08-06T04:54:57.742354Z", + "shell.execute_reply": "2026-08-06T04:54:57.741744Z" } }, "outputs": [ @@ -1098,7 +1098,7 @@ }, { "cell_type": "markdown", - "id": "cbde84a3", + "id": "fced7245", "metadata": {}, "source": [ "## The question that follows every screen\n", @@ -1109,13 +1109,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "1a3e057d", + "id": "d05e4c5e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.660621Z", - "iopub.status.busy": "2026-08-05T21:18:31.660468Z", - "iopub.status.idle": "2026-08-05T21:18:31.671332Z", - "shell.execute_reply": "2026-08-05T21:18:31.670992Z" + "iopub.execute_input": "2026-08-06T04:54:57.743442Z", + "iopub.status.busy": "2026-08-06T04:54:57.743340Z", + "iopub.status.idle": "2026-08-06T04:54:57.760126Z", + "shell.execute_reply": "2026-08-06T04:54:57.759614Z" } }, "outputs": [ @@ -1221,7 +1221,7 @@ }, { "cell_type": "markdown", - "id": "8e6ff0b1", + "id": "64b5a82a", "metadata": {}, "source": [ "This is `rank_genes_groups` with the nouns changed, and it is the operation that\n", @@ -1236,13 +1236,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "280fc2c7", + "id": "657b9186", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.672029Z", - "iopub.status.busy": "2026-08-05T21:18:31.671945Z", - "iopub.status.idle": "2026-08-05T21:18:31.681073Z", - "shell.execute_reply": "2026-08-05T21:18:31.680741Z" + "iopub.execute_input": "2026-08-06T04:54:57.761156Z", + "iopub.status.busy": "2026-08-06T04:54:57.761058Z", + "iopub.status.idle": "2026-08-06T04:54:57.771093Z", + "shell.execute_reply": "2026-08-06T04:54:57.770728Z" } }, "outputs": [ @@ -1328,7 +1328,7 @@ }, { "cell_type": "markdown", - "id": "b9525095", + "id": "3292521e", "metadata": {}, "source": [ "Both report an uncorrected p-value and a Benjamini–Hochberg q-value. With seven\n", @@ -1342,13 +1342,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "b28e485d", + "id": "a7705e26", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.681751Z", - "iopub.status.busy": "2026-08-05T21:18:31.681664Z", - "iopub.status.idle": "2026-08-05T21:18:31.752367Z", - "shell.execute_reply": "2026-08-05T21:18:31.752025Z" + "iopub.execute_input": "2026-08-06T04:54:57.772077Z", + "iopub.status.busy": "2026-08-06T04:54:57.771985Z", + "iopub.status.idle": "2026-08-06T04:54:57.847801Z", + "shell.execute_reply": "2026-08-06T04:54:57.847339Z" } }, "outputs": [ @@ -1386,7 +1386,7 @@ }, { "cell_type": "markdown", - "id": "4cf7317d", + "id": "f52af14d", "metadata": {}, "source": [ "The bar chart when you want the numbers; the periodic table when you want the\n", @@ -1396,13 +1396,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "d25075b3", + "id": "86faa3f2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:31.753076Z", - "iopub.status.busy": "2026-08-05T21:18:31.752987Z", - "iopub.status.idle": "2026-08-05T21:18:32.049739Z", - "shell.execute_reply": "2026-08-05T21:18:32.049358Z" + "iopub.execute_input": "2026-08-06T04:54:57.848727Z", + "iopub.status.busy": "2026-08-06T04:54:57.848635Z", + "iopub.status.idle": "2026-08-06T04:54:59.578368Z", + "shell.execute_reply": "2026-08-06T04:54:59.577667Z" } }, "outputs": [ @@ -1432,7 +1432,7 @@ }, { "cell_type": "markdown", - "id": "6140598a", + "id": "71e4e3ec", "metadata": {}, "source": [ "Aluminium comes out grey rather than dark. Its odds ratio is infinite — it is in\n", @@ -1455,13 +1455,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "96c895fc", + "id": "2c4b21c3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.050512Z", - "iopub.status.busy": "2026-08-05T21:18:32.050420Z", - "iopub.status.idle": "2026-08-05T21:18:32.059208Z", - "shell.execute_reply": "2026-08-05T21:18:32.058866Z" + "iopub.execute_input": "2026-08-06T04:54:59.579962Z", + "iopub.status.busy": "2026-08-06T04:54:59.579776Z", + "iopub.status.idle": "2026-08-06T04:54:59.590770Z", + "shell.execute_reply": "2026-08-06T04:54:59.590194Z" } }, "outputs": [ @@ -1483,7 +1483,7 @@ }, { "cell_type": "markdown", - "id": "5ef8c9f7", + "id": "f6e59a0d", "metadata": {}, "source": [ "## Is this candidate actually new?\n", @@ -1495,13 +1495,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "d978aab7", + "id": "c88c29c2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.059904Z", - "iopub.status.busy": "2026-08-05T21:18:32.059813Z", - "iopub.status.idle": "2026-08-05T21:18:32.070581Z", - "shell.execute_reply": "2026-08-05T21:18:32.070252Z" + "iopub.execute_input": "2026-08-06T04:54:59.591896Z", + "iopub.status.busy": "2026-08-06T04:54:59.591718Z", + "iopub.status.idle": "2026-08-06T04:54:59.609393Z", + "shell.execute_reply": "2026-08-06T04:54:59.608841Z" } }, "outputs": [ @@ -1605,13 +1605,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "1a497eaa", + "id": "a3e04785", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.071271Z", - "iopub.status.busy": "2026-08-05T21:18:32.071180Z", - "iopub.status.idle": "2026-08-05T21:18:32.181043Z", - "shell.execute_reply": "2026-08-05T21:18:32.180717Z" + "iopub.execute_input": "2026-08-06T04:54:59.610849Z", + "iopub.status.busy": "2026-08-06T04:54:59.610660Z", + "iopub.status.idle": "2026-08-06T04:54:59.799639Z", + "shell.execute_reply": "2026-08-06T04:54:59.798961Z" } }, "outputs": [ @@ -1649,7 +1649,7 @@ }, { "cell_type": "markdown", - "id": "3aada339", + "id": "09d232db", "metadata": {}, "source": [ "```{warning}\n", @@ -1684,13 +1684,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "fb3ad245", + "id": "97a859ca", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.181735Z", - "iopub.status.busy": "2026-08-05T21:18:32.181651Z", - "iopub.status.idle": "2026-08-05T21:18:32.188785Z", - "shell.execute_reply": "2026-08-05T21:18:32.188441Z" + "iopub.execute_input": "2026-08-06T04:54:59.800951Z", + "iopub.status.busy": "2026-08-06T04:54:59.800835Z", + "iopub.status.idle": "2026-08-06T04:54:59.810383Z", + "shell.execute_reply": "2026-08-06T04:54:59.809646Z" } }, "outputs": [ @@ -1715,7 +1715,7 @@ }, { "cell_type": "markdown", - "id": "9db55c2b", + "id": "a6fdcb14", "metadata": {}, "source": [ "Anything that reads a *structure* raises, and should — there is none, and\n", @@ -1731,13 +1731,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "6e73b410", + "id": "b58a2096", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.189488Z", - "iopub.status.busy": "2026-08-05T21:18:32.189399Z", - "iopub.status.idle": "2026-08-05T21:18:32.219873Z", - "shell.execute_reply": "2026-08-05T21:18:32.219530Z" + "iopub.execute_input": "2026-08-06T04:54:59.811670Z", + "iopub.status.busy": "2026-08-06T04:54:59.811551Z", + "iopub.status.idle": "2026-08-06T04:54:59.847996Z", + "shell.execute_reply": "2026-08-06T04:54:59.847435Z" } }, "outputs": [ @@ -1773,7 +1773,7 @@ }, { "cell_type": "markdown", - "id": "15af62c5", + "id": "7acfd2a0", "metadata": {}, "source": [ "```{warning}\n", @@ -1796,13 +1796,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "44468fd6", + "id": "76138b28", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.220566Z", - "iopub.status.busy": "2026-08-05T21:18:32.220480Z", - "iopub.status.idle": "2026-08-05T21:18:32.226674Z", - "shell.execute_reply": "2026-08-05T21:18:32.226349Z" + "iopub.execute_input": "2026-08-06T04:54:59.849655Z", + "iopub.status.busy": "2026-08-06T04:54:59.849531Z", + "iopub.status.idle": "2026-08-06T04:54:59.857832Z", + "shell.execute_reply": "2026-08-06T04:54:59.857186Z" } }, "outputs": [ @@ -1829,7 +1829,7 @@ }, { "cell_type": "markdown", - "id": "a216c0bf", + "id": "01b4aa94", "metadata": {}, "source": [ "**The oxidation-state table is a choice.** The default `'icsd24'` is what has\n", @@ -1848,13 +1848,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "b4257bef", + "id": "3f5f5470", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.227357Z", - "iopub.status.busy": "2026-08-05T21:18:32.227270Z", - "iopub.status.idle": "2026-08-05T21:18:32.328981Z", - "shell.execute_reply": "2026-08-05T21:18:32.328614Z" + "iopub.execute_input": "2026-08-06T04:54:59.858917Z", + "iopub.status.busy": "2026-08-06T04:54:59.858812Z", + "iopub.status.idle": "2026-08-06T04:54:59.982252Z", + "shell.execute_reply": "2026-08-06T04:54:59.981589Z" } }, "outputs": [ @@ -1883,7 +1883,7 @@ }, { "cell_type": "markdown", - "id": "f1c44fae", + "id": "270d8a71", "metadata": {}, "source": [ "```{warning}\n", @@ -1908,13 +1908,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "4b8d1a78", + "id": "b1e0b045", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.342596Z", - "iopub.status.busy": "2026-08-05T21:18:32.342422Z", - "iopub.status.idle": "2026-08-05T21:18:32.826250Z", - "shell.execute_reply": "2026-08-05T21:18:32.825756Z" + "iopub.execute_input": "2026-08-06T04:54:59.983483Z", + "iopub.status.busy": "2026-08-06T04:54:59.983275Z", + "iopub.status.idle": "2026-08-06T04:55:00.225204Z", + "shell.execute_reply": "2026-08-06T04:55:00.224315Z" } }, "outputs": [ @@ -1950,7 +1950,7 @@ }, { "cell_type": "markdown", - "id": "e951560d", + "id": "04cf41e6", "metadata": {}, "source": [ "Note the other number: **33 of 40 attempts failed outright**, because a random\n", @@ -1975,13 +1975,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "713e7264", + "id": "e67130cc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.827613Z", - "iopub.status.busy": "2026-08-05T21:18:32.827447Z", - "iopub.status.idle": "2026-08-05T21:18:32.965190Z", - "shell.execute_reply": "2026-08-05T21:18:32.964947Z" + "iopub.execute_input": "2026-08-06T04:55:00.226565Z", + "iopub.status.busy": "2026-08-06T04:55:00.226441Z", + "iopub.status.idle": "2026-08-06T04:55:00.358599Z", + "shell.execute_reply": "2026-08-06T04:55:00.357823Z" } }, "outputs": [ @@ -2012,7 +2012,7 @@ }, { "cell_type": "markdown", - "id": "0f4c89ec", + "id": "a75a08b6", "metadata": {}, "source": [ "It also works on any dataset that has been through `mv.pp.symmetry`, which now\n", @@ -2024,13 +2024,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "63b90d2f", + "id": "805bf33f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:32.966395Z", - "iopub.status.busy": "2026-08-05T21:18:32.966216Z", - "iopub.status.idle": "2026-08-05T21:18:34.406828Z", - "shell.execute_reply": "2026-08-05T21:18:34.406330Z" + "iopub.execute_input": "2026-08-06T04:55:00.359988Z", + "iopub.status.busy": "2026-08-06T04:55:00.359852Z", + "iopub.status.idle": "2026-08-06T04:55:01.734447Z", + "shell.execute_reply": "2026-08-06T04:55:01.733367Z" } }, "outputs": [ @@ -2067,7 +2067,7 @@ }, { "cell_type": "markdown", - "id": "2ef468e1", + "id": "835e7f13", "metadata": {}, "source": [ "On a screening library rather than a generated set, the same plot answers a\n", diff --git a/matverse_guide/docs/tutorials/data_io.ipynb b/matverse_guide/docs/tutorials/data_io.ipynb index 77dbc07..3728bd7 100644 --- a/matverse_guide/docs/tutorials/data_io.ipynb +++ b/matverse_guide/docs/tutorials/data_io.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "5a30ad19", + "id": "c9eb45b8", "metadata": {}, "source": [ "# Getting data in and out\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "b7b91051", + "id": "5a9b1a7b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:55.819545Z", - "iopub.status.busy": "2026-08-05T21:36:55.819420Z", - "iopub.status.idle": "2026-08-05T21:37:04.701314Z", - "shell.execute_reply": "2026-08-05T21:37:04.700343Z" + "iopub.execute_input": "2026-08-06T05:20:15.906828Z", + "iopub.status.busy": "2026-08-06T05:20:15.906718Z", + "iopub.status.idle": "2026-08-06T05:20:29.115833Z", + "shell.execute_reply": "2026-08-06T05:20:29.115351Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "271efb7f", + "id": "06342c8f", "metadata": {}, "source": [ "## From a database, over OPTIMADE\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "eb680cf9", + "id": "2326934d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:04.704335Z", - "iopub.status.busy": "2026-08-05T21:37:04.703556Z", - "iopub.status.idle": "2026-08-05T21:37:04.708658Z", - "shell.execute_reply": "2026-08-05T21:37:04.708232Z" + "iopub.execute_input": "2026-08-06T05:20:29.117607Z", + "iopub.status.busy": "2026-08-06T05:20:29.117059Z", + "iopub.status.idle": "2026-08-06T05:20:29.120497Z", + "shell.execute_reply": "2026-08-06T05:20:29.120178Z" } }, "outputs": [ @@ -132,7 +132,7 @@ }, { "cell_type": "markdown", - "id": "228369f5", + "id": "ca3f3ceb", "metadata": {}, "source": [ "We query [OQMD](https://oqmd.org/) — about 1.4 million entries — for every\n", @@ -142,13 +142,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "6128e0ef", + "id": "ca371100", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:04.710127Z", - "iopub.status.busy": "2026-08-05T21:37:04.710004Z", - "iopub.status.idle": "2026-08-05T21:37:09.337328Z", - "shell.execute_reply": "2026-08-05T21:37:09.336849Z" + "iopub.execute_input": "2026-08-06T05:20:29.121808Z", + "iopub.status.busy": "2026-08-06T05:20:29.121637Z", + "iopub.status.idle": "2026-08-06T05:20:36.552533Z", + "shell.execute_reply": "2026-08-06T05:20:36.552255Z" } }, "outputs": [ @@ -201,13 +201,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "2e82cc19", + "id": "af46cadf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:09.338798Z", - "iopub.status.busy": "2026-08-05T21:37:09.338671Z", - "iopub.status.idle": "2026-08-05T21:37:09.368993Z", - "shell.execute_reply": "2026-08-05T21:37:09.368524Z" + "iopub.execute_input": "2026-08-06T05:20:36.555119Z", + "iopub.status.busy": "2026-08-06T05:20:36.554447Z", + "iopub.status.idle": "2026-08-06T05:20:36.573758Z", + "shell.execute_reply": "2026-08-06T05:20:36.573096Z" } }, "outputs": [ @@ -395,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "d03472b1", + "id": "9dd247dc", "metadata": {}, "source": [ "Real data, with its real database identifiers in `obs['optimade_id']`, so any\n", @@ -412,13 +412,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "8c767947", + "id": "da7fea8c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:09.370528Z", - "iopub.status.busy": "2026-08-05T21:37:09.370392Z", - "iopub.status.idle": "2026-08-05T21:37:10.046920Z", - "shell.execute_reply": "2026-08-05T21:37:10.046293Z" + "iopub.execute_input": "2026-08-06T05:20:36.574929Z", + "iopub.status.busy": "2026-08-06T05:20:36.574771Z", + "iopub.status.idle": "2026-08-06T05:20:37.039893Z", + "shell.execute_reply": "2026-08-06T05:20:37.039225Z" } }, "outputs": [], @@ -432,13 +432,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "d2022174", + "id": "cdbe41c5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.048224Z", - "iopub.status.busy": "2026-08-05T21:37:10.048123Z", - "iopub.status.idle": "2026-08-05T21:37:10.050393Z", - "shell.execute_reply": "2026-08-05T21:37:10.050066Z" + "iopub.execute_input": "2026-08-06T05:20:37.041464Z", + "iopub.status.busy": "2026-08-06T05:20:37.041327Z", + "iopub.status.idle": "2026-08-06T05:20:37.044713Z", + "shell.execute_reply": "2026-08-06T05:20:37.044068Z" } }, "outputs": [ @@ -459,7 +459,7 @@ }, { "cell_type": "markdown", - "id": "5349ffeb", + "id": "e7fd7e81", "metadata": {}, "source": [ "### What a real query gives you that a curated one does not\n", @@ -472,13 +472,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "905a668c", + "id": "7aad6652", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.051237Z", - "iopub.status.busy": "2026-08-05T21:37:10.051146Z", - "iopub.status.idle": "2026-08-05T21:37:10.687210Z", - "shell.execute_reply": "2026-08-05T21:37:10.686656Z" + "iopub.execute_input": "2026-08-06T05:20:37.045732Z", + "iopub.status.busy": "2026-08-06T05:20:37.045617Z", + "iopub.status.idle": "2026-08-06T05:20:37.368238Z", + "shell.execute_reply": "2026-08-06T05:20:37.367761Z" } }, "outputs": [ @@ -506,7 +506,7 @@ }, { "cell_type": "markdown", - "id": "50cd45f5", + "id": "8be98da1", "metadata": {}, "source": [ "**Seven of fifteen were duplicates.** That is not a contrived example — it is\n", @@ -520,13 +520,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "0e47cd91", + "id": "1c2a827f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.688772Z", - "iopub.status.busy": "2026-08-05T21:37:10.688639Z", - "iopub.status.idle": "2026-08-05T21:37:10.696272Z", - "shell.execute_reply": "2026-08-05T21:37:10.695885Z" + "iopub.execute_input": "2026-08-06T05:20:37.370200Z", + "iopub.status.busy": "2026-08-06T05:20:37.369751Z", + "iopub.status.idle": "2026-08-06T05:20:37.377825Z", + "shell.execute_reply": "2026-08-06T05:20:37.377557Z" } }, "outputs": [ @@ -713,7 +713,7 @@ }, { "cell_type": "markdown", - "id": "80b15526", + "id": "a9654cf4", "metadata": {}, "source": [ "### Cached, so the second call is free\n", @@ -724,13 +724,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "64c272a8", + "id": "771e69c9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.697539Z", - "iopub.status.busy": "2026-08-05T21:37:10.697367Z", - "iopub.status.idle": "2026-08-05T21:37:10.773034Z", - "shell.execute_reply": "2026-08-05T21:37:10.772493Z" + "iopub.execute_input": "2026-08-06T05:20:37.379596Z", + "iopub.status.busy": "2026-08-06T05:20:37.379172Z", + "iopub.status.idle": "2026-08-06T05:20:37.414421Z", + "shell.execute_reply": "2026-08-06T05:20:37.414154Z" } }, "outputs": [ @@ -860,13 +860,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "233d84ce", + "id": "9a787877", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.774111Z", - "iopub.status.busy": "2026-08-05T21:37:10.773983Z", - "iopub.status.idle": "2026-08-05T21:37:10.776890Z", - "shell.execute_reply": "2026-08-05T21:37:10.776499Z" + "iopub.execute_input": "2026-08-06T05:20:37.416175Z", + "iopub.status.busy": "2026-08-06T05:20:37.415764Z", + "iopub.status.idle": "2026-08-06T05:20:37.419478Z", + "shell.execute_reply": "2026-08-06T05:20:37.419176Z" } }, "outputs": [ @@ -891,13 +891,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "1c86c431", + "id": "3da56cd3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.778033Z", - "iopub.status.busy": "2026-08-05T21:37:10.777918Z", - "iopub.status.idle": "2026-08-05T21:37:10.780376Z", - "shell.execute_reply": "2026-08-05T21:37:10.779972Z" + "iopub.execute_input": "2026-08-06T05:20:37.421116Z", + "iopub.status.busy": "2026-08-06T05:20:37.420733Z", + "iopub.status.idle": "2026-08-06T05:20:37.423895Z", + "shell.execute_reply": "2026-08-06T05:20:37.423660Z" } }, "outputs": [ @@ -918,7 +918,7 @@ }, { "cell_type": "markdown", - "id": "f8111ee5", + "id": "080603ca", "metadata": {}, "source": [ "```{warning}\n", @@ -949,13 +949,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "ed128b6b", + "id": "2768f473", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.781449Z", - "iopub.status.busy": "2026-08-05T21:37:10.781344Z", - "iopub.status.idle": "2026-08-05T21:37:10.805966Z", - "shell.execute_reply": "2026-08-05T21:37:10.805469Z" + "iopub.execute_input": "2026-08-06T05:20:37.425520Z", + "iopub.status.busy": "2026-08-06T05:20:37.425133Z", + "iopub.status.idle": "2026-08-06T05:20:37.437056Z", + "shell.execute_reply": "2026-08-06T05:20:37.436790Z" } }, "outputs": [ @@ -1026,7 +1026,7 @@ }, { "cell_type": "markdown", - "id": "7a90afbf", + "id": "55b89769", "metadata": {}, "source": [ "## From structures you already have" @@ -1035,13 +1035,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "d262c580", + "id": "4c60646b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.807254Z", - "iopub.status.busy": "2026-08-05T21:37:10.807120Z", - "iopub.status.idle": "2026-08-05T21:37:10.815983Z", - "shell.execute_reply": "2026-08-05T21:37:10.815602Z" + "iopub.execute_input": "2026-08-06T05:20:37.438780Z", + "iopub.status.busy": "2026-08-06T05:20:37.438389Z", + "iopub.status.idle": "2026-08-06T05:20:37.448026Z", + "shell.execute_reply": "2026-08-06T05:20:37.447764Z" } }, "outputs": [ @@ -1114,7 +1114,7 @@ }, { "cell_type": "markdown", - "id": "9c04f103", + "id": "128f292e", "metadata": {}, "source": [ "Pass a DataFrame and it becomes `obs`, aligned by position.\n", @@ -1128,13 +1128,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "52b91ec6", + "id": "e47245ef", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.817227Z", - "iopub.status.busy": "2026-08-05T21:37:10.817053Z", - "iopub.status.idle": "2026-08-05T21:37:10.837030Z", - "shell.execute_reply": "2026-08-05T21:37:10.836510Z" + "iopub.execute_input": "2026-08-06T05:20:37.449743Z", + "iopub.status.busy": "2026-08-06T05:20:37.449348Z", + "iopub.status.idle": "2026-08-06T05:20:37.457454Z", + "shell.execute_reply": "2026-08-06T05:20:37.457190Z" } }, "outputs": [ @@ -1163,7 +1163,7 @@ }, { "cell_type": "markdown", - "id": "e4c35b73", + "id": "45b79a66", "metadata": {}, "source": [ "## From ASE\n", @@ -1175,13 +1175,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "d726152a", + "id": "a7ede9af", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.838061Z", - "iopub.status.busy": "2026-08-05T21:37:10.837938Z", - "iopub.status.idle": "2026-08-05T21:37:10.868036Z", - "shell.execute_reply": "2026-08-05T21:37:10.867525Z" + "iopub.execute_input": "2026-08-06T05:20:37.459186Z", + "iopub.status.busy": "2026-08-06T05:20:37.458776Z", + "iopub.status.idle": "2026-08-06T05:20:37.476038Z", + "shell.execute_reply": "2026-08-06T05:20:37.475720Z" } }, "outputs": [ @@ -1250,7 +1250,7 @@ }, { "cell_type": "markdown", - "id": "f8166cc3", + "id": "496c6a49", "metadata": {}, "source": [ "### From a trajectory or structure file\n", @@ -1263,13 +1263,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "c77f59cf", + "id": "d8f42cb7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.869372Z", - "iopub.status.busy": "2026-08-05T21:37:10.869235Z", - "iopub.status.idle": "2026-08-05T21:37:10.901959Z", - "shell.execute_reply": "2026-08-05T21:37:10.901514Z" + "iopub.execute_input": "2026-08-06T05:20:37.477680Z", + "iopub.status.busy": "2026-08-06T05:20:37.477290Z", + "iopub.status.idle": "2026-08-06T05:20:37.497404Z", + "shell.execute_reply": "2026-08-06T05:20:37.497131Z" } }, "outputs": [ @@ -1352,7 +1352,7 @@ }, { "cell_type": "markdown", - "id": "2b79d177", + "id": "51743482", "metadata": {}, "source": [ "## CIFs, out and back\n", @@ -1363,13 +1363,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "2982bde5", + "id": "14635479", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.903252Z", - "iopub.status.busy": "2026-08-05T21:37:10.903055Z", - "iopub.status.idle": "2026-08-05T21:37:10.951999Z", - "shell.execute_reply": "2026-08-05T21:37:10.951512Z" + "iopub.execute_input": "2026-08-06T05:20:37.498877Z", + "iopub.status.busy": "2026-08-06T05:20:37.498735Z", + "iopub.status.idle": "2026-08-06T05:20:37.521278Z", + "shell.execute_reply": "2026-08-06T05:20:37.521010Z" } }, "outputs": [ @@ -1392,13 +1392,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "a9f87547", + "id": "e87a1de8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:10.953395Z", - "iopub.status.busy": "2026-08-05T21:37:10.953265Z", - "iopub.status.idle": "2026-08-05T21:37:11.023006Z", - "shell.execute_reply": "2026-08-05T21:37:11.022299Z" + "iopub.execute_input": "2026-08-06T05:20:37.523051Z", + "iopub.status.busy": "2026-08-06T05:20:37.522633Z", + "iopub.status.idle": "2026-08-06T05:20:37.565892Z", + "shell.execute_reply": "2026-08-06T05:20:37.565261Z" } }, "outputs": [ @@ -1485,7 +1485,7 @@ }, { "cell_type": "markdown", - "id": "1578d3ce", + "id": "3c77b61b", "metadata": {}, "source": [ "Out and back with the formulas intact. `to_cif` names each file from its row,\n", @@ -1497,13 +1497,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "9f8d320c", + "id": "d39aaaa1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.024308Z", - "iopub.status.busy": "2026-08-05T21:37:11.024161Z", - "iopub.status.idle": "2026-08-05T21:37:11.027645Z", - "shell.execute_reply": "2026-08-05T21:37:11.027237Z" + "iopub.execute_input": "2026-08-06T05:20:37.567211Z", + "iopub.status.busy": "2026-08-06T05:20:37.567101Z", + "iopub.status.idle": "2026-08-06T05:20:37.570059Z", + "shell.execute_reply": "2026-08-06T05:20:37.569741Z" } }, "outputs": [ @@ -1527,13 +1527,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "a71ed570", + "id": "93d4a513", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.028890Z", - "iopub.status.busy": "2026-08-05T21:37:11.028769Z", - "iopub.status.idle": "2026-08-05T21:37:11.031591Z", - "shell.execute_reply": "2026-08-05T21:37:11.031263Z" + "iopub.execute_input": "2026-08-06T05:20:37.571408Z", + "iopub.status.busy": "2026-08-06T05:20:37.571314Z", + "iopub.status.idle": "2026-08-06T05:20:37.573571Z", + "shell.execute_reply": "2026-08-06T05:20:37.573334Z" } }, "outputs": [ @@ -1555,7 +1555,7 @@ }, { "cell_type": "markdown", - "id": "04774071", + "id": "e47c290b", "metadata": {}, "source": [ "And the object itself is an ordinary `AnnData`, so `write_h5ad` is the archive\n", @@ -1572,13 +1572,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "c29cb0b8", + "id": "3850b569", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.032473Z", - "iopub.status.busy": "2026-08-05T21:37:11.032363Z", - "iopub.status.idle": "2026-08-05T21:37:11.038643Z", - "shell.execute_reply": "2026-08-05T21:37:11.038272Z" + "iopub.execute_input": "2026-08-06T05:20:37.574819Z", + "iopub.status.busy": "2026-08-06T05:20:37.574727Z", + "iopub.status.idle": "2026-08-06T05:20:37.580260Z", + "shell.execute_reply": "2026-08-06T05:20:37.579852Z" } }, "outputs": [ @@ -1611,13 +1611,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "81ad24e9", + "id": "f58b908a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.039548Z", - "iopub.status.busy": "2026-08-05T21:37:11.039383Z", - "iopub.status.idle": "2026-08-05T21:37:11.058927Z", - "shell.execute_reply": "2026-08-05T21:37:11.058492Z" + "iopub.execute_input": "2026-08-06T05:20:37.581458Z", + "iopub.status.busy": "2026-08-06T05:20:37.581315Z", + "iopub.status.idle": "2026-08-06T05:20:37.596905Z", + "shell.execute_reply": "2026-08-06T05:20:37.596361Z" } }, "outputs": [ @@ -1645,13 +1645,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "4482e0c2", + "id": "7f983dee", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.059863Z", - "iopub.status.busy": "2026-08-05T21:37:11.059737Z", - "iopub.status.idle": "2026-08-05T21:37:11.062745Z", - "shell.execute_reply": "2026-08-05T21:37:11.062404Z" + "iopub.execute_input": "2026-08-06T05:20:37.598233Z", + "iopub.status.busy": "2026-08-06T05:20:37.598133Z", + "iopub.status.idle": "2026-08-06T05:20:37.600802Z", + "shell.execute_reply": "2026-08-06T05:20:37.600429Z" } }, "outputs": [ @@ -1673,7 +1673,7 @@ }, { "cell_type": "markdown", - "id": "f26072b5", + "id": "2ac21041", "metadata": {}, "source": [ "```{note}\n", @@ -1688,13 +1688,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "e1d0a602", + "id": "264ebe31", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:11.063625Z", - "iopub.status.busy": "2026-08-05T21:37:11.063513Z", - "iopub.status.idle": "2026-08-05T21:37:11.065694Z", - "shell.execute_reply": "2026-08-05T21:37:11.065375Z" + "iopub.execute_input": "2026-08-06T05:20:37.601799Z", + "iopub.status.busy": "2026-08-06T05:20:37.601708Z", + "iopub.status.idle": "2026-08-06T05:20:37.603456Z", + "shell.execute_reply": "2026-08-06T05:20:37.603253Z" } }, "outputs": [ @@ -1721,7 +1721,7 @@ }, { "cell_type": "markdown", - "id": "f09c355a", + "id": "7745ccc2", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb b/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb index f032790..150b59a 100644 --- a/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb +++ b/matverse_guide/docs/tutorials/defects_and_diffusion.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "3098ddf3", + "id": "1e8594d1", "metadata": {}, "source": [ "# Defects and diffusion\n", @@ -25,13 +25,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "ef78fb4d", + "id": "c6cd8363", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:02.781723Z", - "iopub.status.busy": "2026-08-05T21:19:02.781639Z", - "iopub.status.idle": "2026-08-05T21:19:08.320883Z", - "shell.execute_reply": "2026-08-05T21:19:08.320399Z" + "iopub.execute_input": "2026-08-06T04:55:51.520144Z", + "iopub.status.busy": "2026-08-06T04:55:51.520041Z", + "iopub.status.idle": "2026-08-06T04:55:59.253092Z", + "shell.execute_reply": "2026-08-06T04:55:59.252636Z" } }, "outputs": [ @@ -75,7 +75,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "353f2f22", + "id": "6448d19a", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -103,13 +103,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "eda5d9b6", + "id": "90170fd5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.322227Z", - "iopub.status.busy": "2026-08-05T21:19:08.321832Z", - "iopub.status.idle": "2026-08-05T21:19:08.336770Z", - "shell.execute_reply": "2026-08-05T21:19:08.336397Z" + "iopub.execute_input": "2026-08-06T04:55:59.254728Z", + "iopub.status.busy": "2026-08-06T04:55:59.254308Z", + "iopub.status.idle": "2026-08-06T04:55:59.271621Z", + "shell.execute_reply": "2026-08-06T04:55:59.270933Z" } }, "outputs": [ @@ -171,7 +171,7 @@ }, { "cell_type": "markdown", - "id": "7e0e5045", + "id": "8998d828", "metadata": {}, "source": [ "### Two ways to deform a cell before you break it\n", @@ -185,13 +185,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "99e7da17", + "id": "246a9527", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.337665Z", - "iopub.status.busy": "2026-08-05T21:19:08.337511Z", - "iopub.status.idle": "2026-08-05T21:19:08.342802Z", - "shell.execute_reply": "2026-08-05T21:19:08.342442Z" + "iopub.execute_input": "2026-08-06T04:55:59.272680Z", + "iopub.status.busy": "2026-08-06T04:55:59.272563Z", + "iopub.status.idle": "2026-08-06T04:55:59.279900Z", + "shell.execute_reply": "2026-08-06T04:55:59.279259Z" } }, "outputs": [ @@ -216,13 +216,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "a8346819", + "id": "ed0cb295", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.343625Z", - "iopub.status.busy": "2026-08-05T21:19:08.343453Z", - "iopub.status.idle": "2026-08-05T21:19:08.346625Z", - "shell.execute_reply": "2026-08-05T21:19:08.346303Z" + "iopub.execute_input": "2026-08-06T04:55:59.280952Z", + "iopub.status.busy": "2026-08-06T04:55:59.280837Z", + "iopub.status.idle": "2026-08-06T04:55:59.285482Z", + "shell.execute_reply": "2026-08-06T04:55:59.284866Z" } }, "outputs": [ @@ -243,7 +243,7 @@ }, { "cell_type": "markdown", - "id": "52fa37fc", + "id": "6d4ec356", "metadata": {}, "source": [ "## Enumerating the defects\n", @@ -257,13 +257,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "a2b30abd", + "id": "fe04d328", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.347339Z", - "iopub.status.busy": "2026-08-05T21:19:08.347253Z", - "iopub.status.idle": "2026-08-05T21:19:08.367166Z", - "shell.execute_reply": "2026-08-05T21:19:08.366790Z" + "iopub.execute_input": "2026-08-06T04:55:59.286478Z", + "iopub.status.busy": "2026-08-06T04:55:59.286366Z", + "iopub.status.idle": "2026-08-06T04:55:59.308505Z", + "shell.execute_reply": "2026-08-06T04:55:59.307821Z" } }, "outputs": [ @@ -327,7 +327,7 @@ }, { "cell_type": "markdown", - "id": "505436f2", + "id": "dee3c473", "metadata": {}, "source": [ "```{note}\n", @@ -348,13 +348,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "0c90f442", + "id": "a0396847", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.367979Z", - "iopub.status.busy": "2026-08-05T21:19:08.367887Z", - "iopub.status.idle": "2026-08-05T21:19:08.415366Z", - "shell.execute_reply": "2026-08-05T21:19:08.414875Z" + "iopub.execute_input": "2026-08-06T04:55:59.309587Z", + "iopub.status.busy": "2026-08-06T04:55:59.309466Z", + "iopub.status.idle": "2026-08-06T04:56:00.309263Z", + "shell.execute_reply": "2026-08-06T04:56:00.308413Z" } }, "outputs": [ @@ -414,7 +414,7 @@ }, { "cell_type": "markdown", - "id": "faebf88a", + "id": "8b529a68", "metadata": {}, "source": [ "```{note}\n", @@ -433,7 +433,7 @@ }, { "cell_type": "markdown", - "id": "26680a0e", + "id": "a8af4fdd", "metadata": {}, "source": [ "### Two kinds that are not a site you already have\n", @@ -451,13 +451,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "47478c83", + "id": "75a797aa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:08.416203Z", - "iopub.status.busy": "2026-08-05T21:19:08.416112Z", - "iopub.status.idle": "2026-08-05T21:19:10.461578Z", - "shell.execute_reply": "2026-08-05T21:19:10.461152Z" + "iopub.execute_input": "2026-08-06T04:56:00.310462Z", + "iopub.status.busy": "2026-08-06T04:56:00.310330Z", + "iopub.status.idle": "2026-08-06T04:56:02.583057Z", + "shell.execute_reply": "2026-08-06T04:56:02.582282Z" } }, "outputs": [ @@ -492,43 +492,43 @@ " \n", " 0\n", " antisite\n", - " O\n", " Fe\n", + " P\n", " 168\n", " \n", " \n", " 1\n", " antisite\n", - " O\n", " Fe\n", + " O\n", " 168\n", " \n", " \n", " 2\n", " antisite\n", - " O\n", " Fe\n", + " Li\n", " 168\n", " \n", " \n", " 3\n", " antisite\n", - " O\n", + " P\n", " Fe\n", " 168\n", " \n", " \n", " 4\n", " antisite\n", - " O\n", " P\n", + " O\n", " 168\n", " \n", " \n", " 5\n", " antisite\n", - " O\n", " P\n", + " Li\n", " 168\n", " \n", " \n", @@ -537,12 +537,12 @@ ], "text/plain": [ " defect removed added nsites\n", - "0 antisite O Fe 168\n", - "1 antisite O Fe 168\n", - "2 antisite O Fe 168\n", - "3 antisite O Fe 168\n", - "4 antisite O P 168\n", - "5 antisite O P 168" + "0 antisite Fe P 168\n", + "1 antisite Fe O 168\n", + "2 antisite Fe Li 168\n", + "3 antisite P Fe 168\n", + "4 antisite P O 168\n", + "5 antisite P Li 168" ] }, "execution_count": 7, @@ -561,7 +561,7 @@ }, { "cell_type": "markdown", - "id": "7686651a", + "id": "24362c0e", "metadata": {}, "source": [ "Twenty-four antisites from a four-species cathode, each an ordered swap — Fe on\n", @@ -574,13 +574,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "bbf6af0a", + "id": "a166929e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:10.462651Z", - "iopub.status.busy": "2026-08-05T21:19:10.462482Z", - "iopub.status.idle": "2026-08-05T21:19:19.767489Z", - "shell.execute_reply": "2026-08-05T21:19:19.766996Z" + "iopub.execute_input": "2026-08-06T04:56:02.584357Z", + "iopub.status.busy": "2026-08-06T04:56:02.584210Z", + "iopub.status.idle": "2026-08-06T04:56:12.093359Z", + "shell.execute_reply": "2026-08-06T04:56:12.092477Z" } }, "outputs": [ @@ -661,7 +661,7 @@ }, { "cell_type": "markdown", - "id": "4937a048", + "id": "94a552bd", "metadata": {}, "source": [ "One more atom than the host supercell, which is what an interstitial is.\n", @@ -676,7 +676,7 @@ }, { "cell_type": "markdown", - "id": "d4c190a3", + "id": "0802ac7f", "metadata": {}, "source": [ "The raw energy of a cell with one atom missing is not a formation energy. A\n", @@ -692,13 +692,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "2f67a00a", + "id": "9646b285", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.768582Z", - "iopub.status.busy": "2026-08-05T21:19:19.768474Z", - "iopub.status.idle": "2026-08-05T21:19:19.798352Z", - "shell.execute_reply": "2026-08-05T21:19:19.797964Z" + "iopub.execute_input": "2026-08-06T04:56:12.094876Z", + "iopub.status.busy": "2026-08-06T04:56:12.094723Z", + "iopub.status.idle": "2026-08-06T04:56:12.132901Z", + "shell.execute_reply": "2026-08-06T04:56:12.132260Z" } }, "outputs": [ @@ -719,7 +719,7 @@ }, { "cell_type": "markdown", - "id": "5056ef34", + "id": "6aec01e8", "metadata": {}, "source": [ "An elemental solid has no window — copper in equilibrium with copper fixes its\n", @@ -731,13 +731,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "93212a7a", + "id": "c2976b97", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.799139Z", - "iopub.status.busy": "2026-08-05T21:19:19.799048Z", - "iopub.status.idle": "2026-08-05T21:19:19.801980Z", - "shell.execute_reply": "2026-08-05T21:19:19.801646Z" + "iopub.execute_input": "2026-08-06T04:56:12.139460Z", + "iopub.status.busy": "2026-08-06T04:56:12.139207Z", + "iopub.status.idle": "2026-08-06T04:56:12.142669Z", + "shell.execute_reply": "2026-08-06T04:56:12.142366Z" } }, "outputs": [ @@ -764,7 +764,7 @@ }, { "cell_type": "markdown", - "id": "c19c3311", + "id": "78cc9080", "metadata": {}, "source": [ "**1.314 eV**, against roughly 1.3 eV measured for copper by positron\n", @@ -789,13 +789,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "dda512b1", + "id": "f2d2ac1e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.802670Z", - "iopub.status.busy": "2026-08-05T21:19:19.802582Z", - "iopub.status.idle": "2026-08-05T21:19:19.806102Z", - "shell.execute_reply": "2026-08-05T21:19:19.805796Z" + "iopub.execute_input": "2026-08-06T04:56:12.143500Z", + "iopub.status.busy": "2026-08-06T04:56:12.143329Z", + "iopub.status.idle": "2026-08-06T04:56:12.147475Z", + "shell.execute_reply": "2026-08-06T04:56:12.147185Z" } }, "outputs": [ @@ -822,13 +822,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "a29c899e", + "id": "2c3d28fa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.806795Z", - "iopub.status.busy": "2026-08-05T21:19:19.806713Z", - "iopub.status.idle": "2026-08-05T21:19:19.936829Z", - "shell.execute_reply": "2026-08-05T21:19:19.936393Z" + "iopub.execute_input": "2026-08-06T04:56:12.148277Z", + "iopub.status.busy": "2026-08-06T04:56:12.148117Z", + "iopub.status.idle": "2026-08-06T04:56:12.308288Z", + "shell.execute_reply": "2026-08-06T04:56:12.307906Z" } }, "outputs": [ @@ -872,13 +872,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "7b5b62d3", + "id": "4b5bd2b5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.937696Z", - "iopub.status.busy": "2026-08-05T21:19:19.937589Z", - "iopub.status.idle": "2026-08-05T21:19:19.942065Z", - "shell.execute_reply": "2026-08-05T21:19:19.941737Z" + "iopub.execute_input": "2026-08-06T04:56:12.309185Z", + "iopub.status.busy": "2026-08-06T04:56:12.308998Z", + "iopub.status.idle": "2026-08-06T04:56:12.313954Z", + "shell.execute_reply": "2026-08-06T04:56:12.313636Z" } }, "outputs": [ @@ -936,7 +936,7 @@ }, { "cell_type": "markdown", - "id": "6ddf45f2", + "id": "b20e614d", "metadata": {}, "source": [ "Each straight segment is one charge state, and its slope is the charge; the\n", @@ -961,7 +961,7 @@ }, { "cell_type": "markdown", - "id": "25873d61", + "id": "3680b5a2", "metadata": {}, "source": [ "### The charged states are lying, and by how much\n", @@ -979,13 +979,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "178c1d05", + "id": "9bf140c6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:19.942771Z", - "iopub.status.busy": "2026-08-05T21:19:19.942685Z", - "iopub.status.idle": "2026-08-05T21:19:20.023237Z", - "shell.execute_reply": "2026-08-05T21:19:20.022862Z" + "iopub.execute_input": "2026-08-06T04:56:12.314732Z", + "iopub.status.busy": "2026-08-06T04:56:12.314573Z", + "iopub.status.idle": "2026-08-06T04:56:12.448335Z", + "shell.execute_reply": "2026-08-06T04:56:12.422351Z" } }, "outputs": [ @@ -1022,7 +1022,7 @@ }, { "cell_type": "markdown", - "id": "c261cfc5", + "id": "28f9ea86", "metadata": {}, "source": [ "Zero shift at the valence band maximum and a growing one across the gap, which\n", @@ -1069,7 +1069,7 @@ }, { "cell_type": "markdown", - "id": "f6ccf5c6", + "id": "9f07ef54", "metadata": {}, "source": [ "## What it costs to move\n", @@ -1084,13 +1084,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "435baa1a", + "id": "c472b7ec", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:20.023979Z", - "iopub.status.busy": "2026-08-05T21:19:20.023886Z", - "iopub.status.idle": "2026-08-05T21:19:20.031981Z", - "shell.execute_reply": "2026-08-05T21:19:20.031661Z" + "iopub.execute_input": "2026-08-06T04:56:12.452348Z", + "iopub.status.busy": "2026-08-06T04:56:12.452080Z", + "iopub.status.idle": "2026-08-06T04:56:12.472896Z", + "shell.execute_reply": "2026-08-06T04:56:12.472295Z" } }, "outputs": [ @@ -1147,7 +1147,7 @@ }, { "cell_type": "markdown", - "id": "def45be2", + "id": "e4322a59", "metadata": {}, "source": [ "2.556 Å is the nearest-neighbour distance in copper, `a/√2`, which is what a\n", @@ -1171,13 +1171,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "61d8e7ce", + "id": "86a66a1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:20.032659Z", - "iopub.status.busy": "2026-08-05T21:19:20.032575Z", - "iopub.status.idle": "2026-08-05T21:19:20.066956Z", - "shell.execute_reply": "2026-08-05T21:19:20.066622Z" + "iopub.execute_input": "2026-08-06T04:56:12.474151Z", + "iopub.status.busy": "2026-08-06T04:56:12.473920Z", + "iopub.status.idle": "2026-08-06T04:56:12.534236Z", + "shell.execute_reply": "2026-08-06T04:56:12.533689Z" } }, "outputs": [ @@ -1210,7 +1210,7 @@ }, { "cell_type": "markdown", - "id": "b6791dac", + "id": "2fc8b584", "metadata": {}, "source": [ "`key_added` matters here. Without it the second relaxation would overwrite the\n", @@ -1226,13 +1226,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "c1c9a6cd", + "id": "14cb754e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:20.067632Z", - "iopub.status.busy": "2026-08-05T21:19:20.067549Z", - "iopub.status.idle": "2026-08-05T21:19:21.033062Z", - "shell.execute_reply": "2026-08-05T21:19:21.032588Z" + "iopub.execute_input": "2026-08-06T04:56:12.535322Z", + "iopub.status.busy": "2026-08-06T04:56:12.535194Z", + "iopub.status.idle": "2026-08-06T04:56:13.679128Z", + "shell.execute_reply": "2026-08-06T04:56:13.678566Z" } }, "outputs": [ @@ -1295,7 +1295,7 @@ }, { "cell_type": "markdown", - "id": "8b83343f", + "id": "57a7536a", "metadata": {}, "source": [ "**0.754 eV against a literature value of about 0.70 eV.** For a potential that\n", @@ -1318,13 +1318,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "bcbbf1bd", + "id": "ada653f6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.034003Z", - "iopub.status.busy": "2026-08-05T21:19:21.033900Z", - "iopub.status.idle": "2026-08-05T21:19:21.158035Z", - "shell.execute_reply": "2026-08-05T21:19:21.157664Z" + "iopub.execute_input": "2026-08-06T04:56:13.680288Z", + "iopub.status.busy": "2026-08-06T04:56:13.680151Z", + "iopub.status.idle": "2026-08-06T04:56:13.810816Z", + "shell.execute_reply": "2026-08-06T04:56:13.810306Z" } }, "outputs": [ @@ -1362,7 +1362,7 @@ }, { "cell_type": "markdown", - "id": "ddad1c31", + "id": "cff62a59", "metadata": {}, "source": [ "The path rises to a single saddle and comes back down, which is what a\n", @@ -1386,13 +1386,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "1d3dce91", + "id": "5b1102aa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.158847Z", - "iopub.status.busy": "2026-08-05T21:19:21.158752Z", - "iopub.status.idle": "2026-08-05T21:19:21.164314Z", - "shell.execute_reply": "2026-08-05T21:19:21.163977Z" + "iopub.execute_input": "2026-08-06T04:56:13.812202Z", + "iopub.status.busy": "2026-08-06T04:56:13.812054Z", + "iopub.status.idle": "2026-08-06T04:56:13.820071Z", + "shell.execute_reply": "2026-08-06T04:56:13.819264Z" } }, "outputs": [ @@ -1487,13 +1487,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "08f12a58", + "id": "3efeb13b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.164998Z", - "iopub.status.busy": "2026-08-05T21:19:21.164913Z", - "iopub.status.idle": "2026-08-05T21:19:21.375830Z", - "shell.execute_reply": "2026-08-05T21:19:21.375434Z" + "iopub.execute_input": "2026-08-06T04:56:13.821318Z", + "iopub.status.busy": "2026-08-06T04:56:13.821156Z", + "iopub.status.idle": "2026-08-06T04:56:14.049647Z", + "shell.execute_reply": "2026-08-06T04:56:14.048877Z" } }, "outputs": [ @@ -1533,7 +1533,7 @@ }, { "cell_type": "markdown", - "id": "d8e14e9c", + "id": "f68ca04a", "metadata": {}, "source": [ "A straight line on this plot is the definition of Arrhenius behaviour, and its\n", @@ -1553,7 +1553,7 @@ }, { "cell_type": "markdown", - "id": "b894e8df", + "id": "a9d9959b", "metadata": {}, "source": [ "## Which barriers are actually worth computing?\n", @@ -1569,13 +1569,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "fd2603ef", + "id": "e267374a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.376693Z", - "iopub.status.busy": "2026-08-05T21:19:21.376595Z", - "iopub.status.idle": "2026-08-05T21:19:21.719053Z", - "shell.execute_reply": "2026-08-05T21:19:21.718662Z" + "iopub.execute_input": "2026-08-06T04:56:14.050858Z", + "iopub.status.busy": "2026-08-06T04:56:14.050742Z", + "iopub.status.idle": "2026-08-06T04:56:14.402162Z", + "shell.execute_reply": "2026-08-06T04:56:14.401403Z" } }, "outputs": [ @@ -1649,7 +1649,7 @@ }, { "cell_type": "markdown", - "id": "c459780f", + "id": "ed6353f2", "metadata": {}, "source": [ "One hop each. Close-packed lithium has twelve neighbours and they are all the\n", @@ -1665,13 +1665,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "373c3fe4", + "id": "2e351c6b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.719861Z", - "iopub.status.busy": "2026-08-05T21:19:21.719769Z", - "iopub.status.idle": "2026-08-05T21:19:21.732959Z", - "shell.execute_reply": "2026-08-05T21:19:21.732622Z" + "iopub.execute_input": "2026-08-06T04:56:14.403296Z", + "iopub.status.busy": "2026-08-06T04:56:14.403169Z", + "iopub.status.idle": "2026-08-06T04:56:14.420235Z", + "shell.execute_reply": "2026-08-06T04:56:14.419557Z" } }, "outputs": [ @@ -1737,7 +1737,7 @@ }, { "cell_type": "markdown", - "id": "3b3a1a25", + "id": "375a0e8c", "metadata": {}, "source": [ "Stretching *c* separates the twelve neighbours into four in the basal plane at\n", @@ -1762,7 +1762,7 @@ }, { "cell_type": "markdown", - "id": "971dbb17", + "id": "5affa7ab", "metadata": {}, "source": [ "## Before the barrier: can the ion get out at all?\n", @@ -1786,13 +1786,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "034dd91d", + "id": "cb2bd561", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:21.733665Z", - "iopub.status.busy": "2026-08-05T21:19:21.733578Z", - "iopub.status.idle": "2026-08-05T21:19:22.075297Z", - "shell.execute_reply": "2026-08-05T21:19:22.074880Z" + "iopub.execute_input": "2026-08-06T04:56:14.421388Z", + "iopub.status.busy": "2026-08-06T04:56:14.421266Z", + "iopub.status.idle": "2026-08-06T04:56:14.768901Z", + "shell.execute_reply": "2026-08-06T04:56:14.768166Z" } }, "outputs": [ @@ -1883,7 +1883,7 @@ }, { "cell_type": "markdown", - "id": "47d3ddfb", + "id": "ab212b1f", "metadata": {}, "source": [ "**3 against 2**, which is the textbook difference between the two: spinel\n", @@ -1903,13 +1903,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "a9a589a3", + "id": "e370a0cf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.076111Z", - "iopub.status.busy": "2026-08-05T21:19:22.076020Z", - "iopub.status.idle": "2026-08-05T21:19:22.190307Z", - "shell.execute_reply": "2026-08-05T21:19:22.189950Z" + "iopub.execute_input": "2026-08-06T04:56:14.770006Z", + "iopub.status.busy": "2026-08-06T04:56:14.769891Z", + "iopub.status.idle": "2026-08-06T04:56:14.890783Z", + "shell.execute_reply": "2026-08-06T04:56:14.890086Z" } }, "outputs": [ @@ -1992,7 +1992,7 @@ }, { "cell_type": "markdown", - "id": "09e2771b", + "id": "b99d1c2f", "metadata": {}, "source": [ "Allow a 5 Å hop and the layered oxide becomes three-dimensional too, because\n", @@ -2010,7 +2010,7 @@ }, { "cell_type": "markdown", - "id": "0af83e52", + "id": "d05336b4", "metadata": {}, "source": [ "## Handing the hop to DFT\n", @@ -2024,13 +2024,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "5e801a19", + "id": "c4430650", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.191057Z", - "iopub.status.busy": "2026-08-05T21:19:22.190967Z", - "iopub.status.idle": "2026-08-05T21:19:22.205561Z", - "shell.execute_reply": "2026-08-05T21:19:22.205201Z" + "iopub.execute_input": "2026-08-06T04:56:14.891906Z", + "iopub.status.busy": "2026-08-06T04:56:14.891792Z", + "iopub.status.idle": "2026-08-06T04:56:14.923694Z", + "shell.execute_reply": "2026-08-06T04:56:14.922924Z" } }, "outputs": [ @@ -2059,7 +2059,7 @@ }, { "cell_type": "markdown", - "id": "e8ff1524", + "id": "f2ed552f", "metadata": {}, "source": [ "Two of those settings are the reason to use a preset rather than write the file\n", @@ -2076,7 +2076,7 @@ }, { "cell_type": "markdown", - "id": "83ac5eef", + "id": "7950b0d5", "metadata": {}, "source": [ "## Finding a defect somebody else made\n", @@ -2093,13 +2093,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "c751951c", + "id": "a51d8ae0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.206330Z", - "iopub.status.busy": "2026-08-05T21:19:22.206178Z", - "iopub.status.idle": "2026-08-05T21:19:22.221006Z", - "shell.execute_reply": "2026-08-05T21:19:22.220663Z" + "iopub.execute_input": "2026-08-06T04:56:14.924773Z", + "iopub.status.busy": "2026-08-06T04:56:14.924659Z", + "iopub.status.idle": "2026-08-06T04:56:14.942314Z", + "shell.execute_reply": "2026-08-06T04:56:14.941855Z" } }, "outputs": [ @@ -2142,7 +2142,7 @@ }, { "cell_type": "markdown", - "id": "73adc817", + "id": "177923bb", "metadata": {}, "source": [ "The vacancy comes back at the coordinates it was made at, from a cell whose\n", @@ -2164,7 +2164,7 @@ }, { "cell_type": "markdown", - "id": "12d533cd", + "id": "d339e194", "metadata": {}, "source": [ "## The curve a charge state leaves behind\n", @@ -2182,13 +2182,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "7f9d420b", + "id": "2aad3053", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.221715Z", - "iopub.status.busy": "2026-08-05T21:19:22.221631Z", - "iopub.status.idle": "2026-08-05T21:19:22.229156Z", - "shell.execute_reply": "2026-08-05T21:19:22.228849Z" + "iopub.execute_input": "2026-08-06T04:56:14.943488Z", + "iopub.status.busy": "2026-08-06T04:56:14.943364Z", + "iopub.status.idle": "2026-08-06T04:56:14.953276Z", + "shell.execute_reply": "2026-08-06T04:56:14.952895Z" } }, "outputs": [ @@ -2228,7 +2228,7 @@ }, { "cell_type": "markdown", - "id": "21835963", + "id": "52e027dc", "metadata": {}, "source": [ "The frequency is $\\hbar\\sqrt{c}$ with the mass-weighted units carried\n", @@ -2254,7 +2254,7 @@ }, { "cell_type": "markdown", - "id": "d6c01d40", + "id": "94ea79c5", "metadata": {}, "source": [ "## Is it a killer?\n", @@ -2271,13 +2271,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "1250d074", + "id": "7a50bc0e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:22.229839Z", - "iopub.status.busy": "2026-08-05T21:19:22.229756Z", - "iopub.status.idle": "2026-08-05T21:19:23.943749Z", - "shell.execute_reply": "2026-08-05T21:19:23.943260Z" + "iopub.execute_input": "2026-08-06T04:56:14.954527Z", + "iopub.status.busy": "2026-08-06T04:56:14.954402Z", + "iopub.status.idle": "2026-08-06T04:56:16.709909Z", + "shell.execute_reply": "2026-08-06T04:56:16.709163Z" } }, "outputs": [ @@ -2348,7 +2348,7 @@ }, { "cell_type": "markdown", - "id": "ec4b580c", + "id": "22ba7462", "metadata": {}, "source": [ "Doubling the electron–phonon matrix element multiplies the capture rate by\n", @@ -2362,13 +2362,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "5f1cb8b2", + "id": "d6db6b96", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:23.944798Z", - "iopub.status.busy": "2026-08-05T21:19:23.944640Z", - "iopub.status.idle": "2026-08-05T21:19:29.342153Z", - "shell.execute_reply": "2026-08-05T21:19:29.341623Z" + "iopub.execute_input": "2026-08-06T04:56:16.711105Z", + "iopub.status.busy": "2026-08-06T04:56:16.710988Z", + "iopub.status.idle": "2026-08-06T04:56:23.254490Z", + "shell.execute_reply": "2026-08-06T04:56:23.254029Z" } }, "outputs": [ @@ -2433,7 +2433,7 @@ }, { "cell_type": "markdown", - "id": "daf9f3ac", + "id": "50e130e5", "metadata": {}, "source": [ "Orders of magnitude across a few hundred kelvin, which is why a capture\n", @@ -2457,7 +2457,7 @@ }, { "cell_type": "markdown", - "id": "f0aea9d1", + "id": "445549c5", "metadata": {}, "source": [ "## What the object remembers" @@ -2466,13 +2466,13 @@ { "cell_type": "code", "execution_count": 30, - "id": "96033c73", + "id": "f94e9c68", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:29.343215Z", - "iopub.status.busy": "2026-08-05T21:19:29.343107Z", - "iopub.status.idle": "2026-08-05T21:19:29.345331Z", - "shell.execute_reply": "2026-08-05T21:19:29.344996Z" + "iopub.execute_input": "2026-08-06T04:56:23.255596Z", + "iopub.status.busy": "2026-08-06T04:56:23.255416Z", + "iopub.status.idle": "2026-08-06T04:56:23.257740Z", + "shell.execute_reply": "2026-08-06T04:56:23.257434Z" } }, "outputs": [ @@ -2501,7 +2501,7 @@ }, { "cell_type": "markdown", - "id": "a68ed469", + "id": "0f71afb6", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/disorder.ipynb b/matverse_guide/docs/tutorials/disorder.ipynb index 50794d7..35483f9 100644 --- a/matverse_guide/docs/tutorials/disorder.ipynb +++ b/matverse_guide/docs/tutorials/disorder.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "20f7a31d", + "id": "9422f12b", "metadata": {}, "source": [ "# Disorder\n", @@ -24,13 +24,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "17e7e64c", + "id": "395d38e5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:32.234301Z", - "iopub.status.busy": "2026-08-05T21:35:32.234214Z", - "iopub.status.idle": "2026-08-05T21:35:37.477412Z", - "shell.execute_reply": "2026-08-05T21:35:37.476974Z" + "iopub.execute_input": "2026-08-06T05:17:53.486784Z", + "iopub.status.busy": "2026-08-06T05:17:53.486666Z", + "iopub.status.idle": "2026-08-06T05:18:07.511622Z", + "shell.execute_reply": "2026-08-06T05:18:07.511022Z" } }, "outputs": [ @@ -74,7 +74,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "f785fb15", + "id": "278eb38c", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -103,13 +103,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "cc691037", + "id": "f6e8bedd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.479152Z", - "iopub.status.busy": "2026-08-05T21:35:37.478647Z", - "iopub.status.idle": "2026-08-05T21:35:37.500448Z", - "shell.execute_reply": "2026-08-05T21:35:37.500106Z" + "iopub.execute_input": "2026-08-06T05:18:07.513119Z", + "iopub.status.busy": "2026-08-06T05:18:07.512649Z", + "iopub.status.idle": "2026-08-06T05:18:07.558953Z", + "shell.execute_reply": "2026-08-06T05:18:07.558544Z" } }, "outputs": [ @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "b698674d", + "id": "b2880632", "metadata": {}, "source": [ "Note that `mv.pp.describe` reports a formula for all three — a disordered cell\n", @@ -208,13 +208,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "6b9facb7", + "id": "27902e1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.501374Z", - "iopub.status.busy": "2026-08-05T21:35:37.501280Z", - "iopub.status.idle": "2026-08-05T21:35:37.507374Z", - "shell.execute_reply": "2026-08-05T21:35:37.507041Z" + "iopub.execute_input": "2026-08-06T05:18:07.559964Z", + "iopub.status.busy": "2026-08-06T05:18:07.559780Z", + "iopub.status.idle": "2026-08-06T05:18:07.576710Z", + "shell.execute_reply": "2026-08-06T05:18:07.576282Z" } }, "outputs": [ @@ -305,7 +305,7 @@ }, { "cell_type": "markdown", - "id": "e2394e38", + "id": "a3654e0f", "metadata": {}, "source": [ "`max_site_disorder` is how far the worst site is from having a single owner:\n", @@ -322,13 +322,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "b32498a5", + "id": "f6b96a33", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.508117Z", - "iopub.status.busy": "2026-08-05T21:35:37.508024Z", - "iopub.status.idle": "2026-08-05T21:35:37.512390Z", - "shell.execute_reply": "2026-08-05T21:35:37.512077Z" + "iopub.execute_input": "2026-08-06T05:18:07.577636Z", + "iopub.status.busy": "2026-08-06T05:18:07.577517Z", + "iopub.status.idle": "2026-08-06T05:18:07.582604Z", + "shell.execute_reply": "2026-08-06T05:18:07.582265Z" } }, "outputs": [ @@ -404,7 +404,7 @@ }, { "cell_type": "markdown", - "id": "4058979e", + "id": "99a1596c", "metadata": {}, "source": [ "Exact. And the consequence is the interesting part." @@ -413,20 +413,20 @@ { "cell_type": "code", "execution_count": 5, - "id": "53e657bb", + "id": "999a2917", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.513253Z", - "iopub.status.busy": "2026-08-05T21:35:37.513155Z", - "iopub.status.idle": "2026-08-05T21:35:37.666655Z", - "shell.execute_reply": "2026-08-05T21:35:37.666171Z" + "iopub.execute_input": "2026-08-06T05:18:07.583400Z", + "iopub.status.busy": "2026-08-06T05:18:07.583285Z", + "iopub.status.idle": "2026-08-06T05:18:07.916820Z", + "shell.execute_reply": "2026-08-06T05:18:07.916461Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -467,7 +467,7 @@ }, { "cell_type": "markdown", - "id": "a41d0e16", + "id": "75dd3ed8", "metadata": {}, "source": [ "At room temperature the entropy term is tens of meV and usually ignorable. At a\n", @@ -496,13 +496,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "61d608c4", + "id": "ba28221d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:37.667598Z", - "iopub.status.busy": "2026-08-05T21:35:37.667498Z", - "iopub.status.idle": "2026-08-05T21:35:38.086024Z", - "shell.execute_reply": "2026-08-05T21:35:38.085646Z" + "iopub.execute_input": "2026-08-06T05:18:07.917885Z", + "iopub.status.busy": "2026-08-06T05:18:07.917780Z", + "iopub.status.idle": "2026-08-06T05:18:08.346783Z", + "shell.execute_reply": "2026-08-06T05:18:08.346381Z" } }, "outputs": [ @@ -622,13 +622,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "0ed85923", + "id": "dd8aa648", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.087209Z", - "iopub.status.busy": "2026-08-05T21:35:38.087105Z", - "iopub.status.idle": "2026-08-05T21:35:38.089416Z", - "shell.execute_reply": "2026-08-05T21:35:38.089100Z" + "iopub.execute_input": "2026-08-06T05:18:08.347910Z", + "iopub.status.busy": "2026-08-06T05:18:08.347783Z", + "iopub.status.idle": "2026-08-06T05:18:08.350289Z", + "shell.execute_reply": "2026-08-06T05:18:08.349983Z" } }, "outputs": [ @@ -649,7 +649,7 @@ }, { "cell_type": "markdown", - "id": "7dffe46e", + "id": "7da80198", "metadata": {}, "source": [ "Every cell is now ordered, and the compositions survived: Cu₀.₅Au₀.₅ became\n", @@ -665,13 +665,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "9992b688", + "id": "591b54b0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.090122Z", - "iopub.status.busy": "2026-08-05T21:35:38.090038Z", - "iopub.status.idle": "2026-08-05T21:35:38.092092Z", - "shell.execute_reply": "2026-08-05T21:35:38.091785Z" + "iopub.execute_input": "2026-08-06T05:18:08.351311Z", + "iopub.status.busy": "2026-08-06T05:18:08.351204Z", + "iopub.status.idle": "2026-08-06T05:18:08.353476Z", + "shell.execute_reply": "2026-08-06T05:18:08.353133Z" } }, "outputs": [ @@ -698,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "0c5d036e", + "id": "eabac2c3", "metadata": {}, "source": [ "Arrangements are ranked by **Ewald energy**, which needs oxidation states.\n", @@ -729,13 +729,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "8df0e9c4", + "id": "4d7a0242", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.092792Z", - "iopub.status.busy": "2026-08-05T21:35:38.092708Z", - "iopub.status.idle": "2026-08-05T21:35:38.169858Z", - "shell.execute_reply": "2026-08-05T21:35:38.169404Z" + "iopub.execute_input": "2026-08-06T05:18:08.354320Z", + "iopub.status.busy": "2026-08-06T05:18:08.354221Z", + "iopub.status.idle": "2026-08-06T05:18:08.502647Z", + "shell.execute_reply": "2026-08-06T05:18:08.502313Z" } }, "outputs": [ @@ -758,7 +758,7 @@ }, { "cell_type": "markdown", - "id": "2c488281", + "id": "610b760a", "metadata": {}, "source": [ "It needs ATAT's `mcsqs`, a separate Fortran program, and it refuses rather than\n", @@ -776,13 +776,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "5c3f5ffd", + "id": "df5be4c7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.170844Z", - "iopub.status.busy": "2026-08-05T21:35:38.170749Z", - "iopub.status.idle": "2026-08-05T21:35:38.197106Z", - "shell.execute_reply": "2026-08-05T21:35:38.196751Z" + "iopub.execute_input": "2026-08-06T05:18:08.503738Z", + "iopub.status.busy": "2026-08-06T05:18:08.503644Z", + "iopub.status.idle": "2026-08-06T05:18:08.547254Z", + "shell.execute_reply": "2026-08-06T05:18:08.546917Z" } }, "outputs": [ @@ -842,13 +842,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "7c6bae12", + "id": "dea8a479", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.197998Z", - "iopub.status.busy": "2026-08-05T21:35:38.197904Z", - "iopub.status.idle": "2026-08-05T21:35:38.200471Z", - "shell.execute_reply": "2026-08-05T21:35:38.200168Z" + "iopub.execute_input": "2026-08-06T05:18:08.548178Z", + "iopub.status.busy": "2026-08-06T05:18:08.548084Z", + "iopub.status.idle": "2026-08-06T05:18:08.559481Z", + "shell.execute_reply": "2026-08-06T05:18:08.559165Z" } }, "outputs": [ @@ -872,7 +872,7 @@ }, { "cell_type": "markdown", - "id": "12f86057", + "id": "b76e441c", "metadata": {}, "source": [ "That message is the point of the function existing at all.\n", @@ -906,13 +906,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "e135e73b", + "id": "72db183a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.201387Z", - "iopub.status.busy": "2026-08-05T21:35:38.201300Z", - "iopub.status.idle": "2026-08-05T21:35:38.203079Z", - "shell.execute_reply": "2026-08-05T21:35:38.202766Z" + "iopub.execute_input": "2026-08-06T05:18:08.560327Z", + "iopub.status.busy": "2026-08-06T05:18:08.560234Z", + "iopub.status.idle": "2026-08-06T05:18:08.562020Z", + "shell.execute_reply": "2026-08-06T05:18:08.561752Z" } }, "outputs": [ @@ -933,7 +933,7 @@ }, { "cell_type": "markdown", - "id": "2889ae58", + "id": "99525d43", "metadata": {}, "source": [ "```{seealso}\n", @@ -945,7 +945,7 @@ }, { "cell_type": "markdown", - "id": "cbae4c4a", + "id": "f426fb79", "metadata": {}, "source": [ "## What can this be alloyed with?\n", @@ -962,13 +962,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "1ae6cac3", + "id": "f8086aec", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.203773Z", - "iopub.status.busy": "2026-08-05T21:35:38.203687Z", - "iopub.status.idle": "2026-08-05T21:35:38.929429Z", - "shell.execute_reply": "2026-08-05T21:35:38.928985Z" + "iopub.execute_input": "2026-08-06T05:18:08.562814Z", + "iopub.status.busy": "2026-08-06T05:18:08.562730Z", + "iopub.status.idle": "2026-08-06T05:18:10.054125Z", + "shell.execute_reply": "2026-08-06T05:18:10.053628Z" } }, "outputs": [ @@ -1063,7 +1063,7 @@ }, { "cell_type": "markdown", - "id": "9850a535", + "id": "24992a37", "metadata": {}, "source": [ "Three pairs out of four materials, and the missing one is the point. **Silicon\n", @@ -1074,13 +1074,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "a1a83f9c", + "id": "8ca3c834", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.930341Z", - "iopub.status.busy": "2026-08-05T21:35:38.930236Z", - "iopub.status.idle": "2026-08-05T21:35:38.932356Z", - "shell.execute_reply": "2026-08-05T21:35:38.932072Z" + "iopub.execute_input": "2026-08-06T05:18:10.055358Z", + "iopub.status.busy": "2026-08-06T05:18:10.055212Z", + "iopub.status.idle": "2026-08-06T05:18:10.057881Z", + "shell.execute_reply": "2026-08-06T05:18:10.057479Z" } }, "outputs": [ @@ -1103,7 +1103,7 @@ }, { "cell_type": "markdown", - "id": "59647ac3", + "id": "a1a25ed5", "metadata": {}, "source": [ "\"Not commensurate\" — there is no species you can swap to get from Si to GaAs\n", @@ -1130,7 +1130,7 @@ }, { "cell_type": "markdown", - "id": "266405df", + "id": "e6c60cd7", "metadata": {}, "source": [ "## Did the disorder work?\n", @@ -1152,13 +1152,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "29a20519", + "id": "33fd2e2c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:38.933096Z", - "iopub.status.busy": "2026-08-05T21:35:38.933011Z", - "iopub.status.idle": "2026-08-05T21:35:39.234056Z", - "shell.execute_reply": "2026-08-05T21:35:39.233676Z" + "iopub.execute_input": "2026-08-06T05:18:10.058915Z", + "iopub.status.busy": "2026-08-06T05:18:10.058798Z", + "iopub.status.idle": "2026-08-06T05:18:10.725396Z", + "shell.execute_reply": "2026-08-06T05:18:10.724756Z" } }, "outputs": [ @@ -1243,7 +1243,7 @@ }, { "cell_type": "markdown", - "id": "c2fe32e2", + "id": "1a76caa3", "metadata": {}, "source": [ "**+1 for the like pairs and −1 for the unlike ones** on B2, which is what\n", @@ -1263,13 +1263,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "5ebcb8cd", + "id": "308f6ea5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:39.234868Z", - "iopub.status.busy": "2026-08-05T21:35:39.234777Z", - "iopub.status.idle": "2026-08-05T21:35:40.312371Z", - "shell.execute_reply": "2026-08-05T21:35:40.311958Z" + "iopub.execute_input": "2026-08-06T05:18:10.727330Z", + "iopub.status.busy": "2026-08-06T05:18:10.727163Z", + "iopub.status.idle": "2026-08-06T05:18:11.614256Z", + "shell.execute_reply": "2026-08-06T05:18:11.610895Z" } }, "outputs": [ @@ -1352,7 +1352,7 @@ }, { "cell_type": "markdown", - "id": "685b471f", + "id": "134b52aa", "metadata": {}, "source": [ "The sign **inverts** between the first shell and the second. In bcc the eight\n", @@ -1375,7 +1375,7 @@ }, { "cell_type": "markdown", - "id": "9eb06e8a", + "id": "fb06af8a", "metadata": {}, "source": [ "## An effective Hamiltonian, and what it buys\n", @@ -1397,13 +1397,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "d1b693da", + "id": "33e0a5f5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:40.313262Z", - "iopub.status.busy": "2026-08-05T21:35:40.313167Z", - "iopub.status.idle": "2026-08-05T21:35:42.286960Z", - "shell.execute_reply": "2026-08-05T21:35:42.286469Z" + "iopub.execute_input": "2026-08-06T05:18:11.615525Z", + "iopub.status.busy": "2026-08-06T05:18:11.615421Z", + "iopub.status.idle": "2026-08-06T05:18:19.889315Z", + "shell.execute_reply": "2026-08-06T05:18:19.888288Z" } }, "outputs": [ @@ -1454,7 +1454,7 @@ }, { "cell_type": "markdown", - "id": "190ed62b", + "id": "a3f436c5", "metadata": {}, "source": [ "The number that says whether a cluster expansion is any good is the\n", @@ -1474,13 +1474,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "8035ba60", + "id": "80354ec6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:42.288347Z", - "iopub.status.busy": "2026-08-05T21:35:42.287903Z", - "iopub.status.idle": "2026-08-05T21:36:24.543136Z", - "shell.execute_reply": "2026-08-05T21:36:24.542320Z" + "iopub.execute_input": "2026-08-06T05:18:19.891533Z", + "iopub.status.busy": "2026-08-06T05:18:19.890612Z", + "iopub.status.idle": "2026-08-06T05:19:42.614386Z", + "shell.execute_reply": "2026-08-06T05:19:42.613585Z" } }, "outputs": [ @@ -1518,7 +1518,7 @@ }, { "cell_type": "markdown", - "id": "59e05233", + "id": "1c9598db", "metadata": {}, "source": [ "A heat capacity that is flat everywhere except one sharp peak, and the peak is\n", diff --git a/matverse_guide/docs/tutorials/dynamics.ipynb b/matverse_guide/docs/tutorials/dynamics.ipynb index 3b3fc40..501b4e0 100644 --- a/matverse_guide/docs/tutorials/dynamics.ipynb +++ b/matverse_guide/docs/tutorials/dynamics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "68c89927", + "id": "474be3dc", "metadata": {}, "source": [ "# Dynamics\n", @@ -23,13 +23,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "af356943", + "id": "98dac5af", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:41.506657Z", - "iopub.status.busy": "2026-08-05T21:19:41.506580Z", - "iopub.status.idle": "2026-08-05T21:19:46.747056Z", - "shell.execute_reply": "2026-08-05T21:19:46.746606Z" + "iopub.execute_input": "2026-08-06T04:56:36.558758Z", + "iopub.status.busy": "2026-08-06T04:56:36.558670Z", + "iopub.status.idle": "2026-08-06T04:56:49.063219Z", + "shell.execute_reply": "2026-08-06T04:56:49.062789Z" } }, "outputs": [ @@ -73,7 +73,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -89,7 +89,7 @@ }, { "cell_type": "markdown", - "id": "10ca724b", + "id": "10d59896", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -102,13 +102,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "3baae380", + "id": "b59d2be5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:46.748423Z", - "iopub.status.busy": "2026-08-05T21:19:46.748012Z", - "iopub.status.idle": "2026-08-05T21:19:46.764406Z", - "shell.execute_reply": "2026-08-05T21:19:46.763923Z" + "iopub.execute_input": "2026-08-06T04:56:49.064685Z", + "iopub.status.busy": "2026-08-06T04:56:49.064251Z", + "iopub.status.idle": "2026-08-06T04:56:49.103743Z", + "shell.execute_reply": "2026-08-06T04:56:49.103126Z" } }, "outputs": [ @@ -170,7 +170,7 @@ }, { "cell_type": "markdown", - "id": "c5dcd398", + "id": "52b53eda", "metadata": {}, "source": [ "## Running\n", @@ -182,13 +182,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "7ba38733", + "id": "59bed1b1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:46.765290Z", - "iopub.status.busy": "2026-08-05T21:19:46.765187Z", - "iopub.status.idle": "2026-08-05T21:19:53.655029Z", - "shell.execute_reply": "2026-08-05T21:19:53.654384Z" + "iopub.execute_input": "2026-08-06T04:56:49.104805Z", + "iopub.status.busy": "2026-08-06T04:56:49.104698Z", + "iopub.status.idle": "2026-08-06T04:56:56.689299Z", + "shell.execute_reply": "2026-08-06T04:56:56.688690Z" } }, "outputs": [ @@ -253,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "b37947c8", + "id": "7804464e", "metadata": {}, "source": [ "`md_temperature_emt` is the temperature the run actually achieved, and it is\n", @@ -278,13 +278,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "e0d41c7d", + "id": "15593444", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:53.656176Z", - "iopub.status.busy": "2026-08-05T21:19:53.656051Z", - "iopub.status.idle": "2026-08-05T21:19:53.658641Z", - "shell.execute_reply": "2026-08-05T21:19:53.658325Z" + "iopub.execute_input": "2026-08-06T04:56:56.691150Z", + "iopub.status.busy": "2026-08-06T04:56:56.690921Z", + "iopub.status.idle": "2026-08-06T04:56:56.693639Z", + "shell.execute_reply": "2026-08-06T04:56:56.693327Z" } }, "outputs": [ @@ -307,20 +307,20 @@ { "cell_type": "code", "execution_count": 5, - "id": "2ede9703", + "id": "666375c5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:53.659349Z", - "iopub.status.busy": "2026-08-05T21:19:53.659259Z", - "iopub.status.idle": "2026-08-05T21:19:53.825689Z", - "shell.execute_reply": "2026-08-05T21:19:53.825328Z" + "iopub.execute_input": "2026-08-06T04:56:56.695127Z", + "iopub.status.busy": "2026-08-06T04:56:56.694942Z", + "iopub.status.idle": "2026-08-06T04:56:57.044626Z", + "shell.execute_reply": "2026-08-06T04:56:57.043861Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -361,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "acc54c55", + "id": "6cd8f80b", "metadata": {}, "source": [ "The instantaneous temperature swings wildly around its mean, and that is\n", @@ -382,13 +382,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "9ab1ac28", + "id": "7cb992f9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:53.826553Z", - "iopub.status.busy": "2026-08-05T21:19:53.826443Z", - "iopub.status.idle": "2026-08-05T21:20:43.318311Z", - "shell.execute_reply": "2026-08-05T21:20:43.305431Z" + "iopub.execute_input": "2026-08-06T04:56:57.046029Z", + "iopub.status.busy": "2026-08-06T04:56:57.045881Z", + "iopub.status.idle": "2026-08-06T04:58:20.032018Z", + "shell.execute_reply": "2026-08-06T04:58:20.031457Z" } }, "outputs": [ @@ -465,13 +465,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "3b1c5859", + "id": "31784a52", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:43.319616Z", - "iopub.status.busy": "2026-08-05T21:20:43.319470Z", - "iopub.status.idle": "2026-08-05T21:20:43.546009Z", - "shell.execute_reply": "2026-08-05T21:20:43.545591Z" + "iopub.execute_input": "2026-08-06T04:58:20.035828Z", + "iopub.status.busy": "2026-08-06T04:58:20.035598Z", + "iopub.status.idle": "2026-08-06T04:58:20.237686Z", + "shell.execute_reply": "2026-08-06T04:58:20.237142Z" } }, "outputs": [ @@ -514,7 +514,7 @@ }, { "cell_type": "markdown", - "id": "62225a85", + "id": "8d6becab", "metadata": {}, "source": [ "A percent or so over 600 K, which is the right order for a metal — copper's\n", @@ -535,13 +535,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "a9a9fc41", + "id": "bcafdc97", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:43.546810Z", - "iopub.status.busy": "2026-08-05T21:20:43.546708Z", - "iopub.status.idle": "2026-08-05T21:20:55.232625Z", - "shell.execute_reply": "2026-08-05T21:20:55.231961Z" + "iopub.execute_input": "2026-08-06T04:58:20.239301Z", + "iopub.status.busy": "2026-08-06T04:58:20.239115Z", + "iopub.status.idle": "2026-08-06T04:58:27.782139Z", + "shell.execute_reply": "2026-08-06T04:58:27.781154Z" } }, "outputs": [ @@ -602,7 +602,7 @@ }, { "cell_type": "markdown", - "id": "961f87ce", + "id": "ae048c04", "metadata": {}, "source": [ "Essentially zero, and that is the right answer. Copper at 300 K has a vacancy\n", @@ -630,13 +630,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "fb77b3ef", + "id": "0bddf540", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:55.233938Z", - "iopub.status.busy": "2026-08-05T21:20:55.233788Z", - "iopub.status.idle": "2026-08-05T21:20:55.500645Z", - "shell.execute_reply": "2026-08-05T21:20:55.500077Z" + "iopub.execute_input": "2026-08-06T04:58:27.783767Z", + "iopub.status.busy": "2026-08-06T04:58:27.783589Z", + "iopub.status.idle": "2026-08-06T04:58:28.096482Z", + "shell.execute_reply": "2026-08-06T04:58:28.095660Z" } }, "outputs": [ @@ -657,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "0ec817f2", + "id": "e88d78b0", "metadata": {}, "source": [ "Empty in this build, because the engine is not installed. Registering one is the\n", @@ -668,13 +668,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "02550b60", + "id": "e5d1c1e3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:55.501875Z", - "iopub.status.busy": "2026-08-05T21:20:55.501738Z", - "iopub.status.idle": "2026-08-05T21:20:55.504929Z", - "shell.execute_reply": "2026-08-05T21:20:55.504517Z" + "iopub.execute_input": "2026-08-06T04:58:28.097701Z", + "iopub.status.busy": "2026-08-06T04:58:28.097571Z", + "iopub.status.idle": "2026-08-06T04:58:28.101771Z", + "shell.execute_reply": "2026-08-06T04:58:28.101143Z" } }, "outputs": [ @@ -709,7 +709,7 @@ }, { "cell_type": "markdown", - "id": "79f1181d", + "id": "b950d15c", "metadata": {}, "source": [ "The factory is lazy, which is why that cell runs in an environment without\n", @@ -732,13 +732,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "dfc8843c", + "id": "0ee7cd2b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:20:55.506012Z", - "iopub.status.busy": "2026-08-05T21:20:55.505900Z", - "iopub.status.idle": "2026-08-05T21:21:49.909845Z", - "shell.execute_reply": "2026-08-05T21:21:49.909291Z" + "iopub.execute_input": "2026-08-06T04:58:28.102855Z", + "iopub.status.busy": "2026-08-06T04:58:28.102731Z", + "iopub.status.idle": "2026-08-06T04:59:16.794733Z", + "shell.execute_reply": "2026-08-06T04:59:16.794004Z" } }, "outputs": [ @@ -798,13 +798,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "fa29d044", + "id": "05991727", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:49.923008Z", - "iopub.status.busy": "2026-08-05T21:21:49.922733Z", - "iopub.status.idle": "2026-08-05T21:21:49.925699Z", - "shell.execute_reply": "2026-08-05T21:21:49.925247Z" + "iopub.execute_input": "2026-08-06T04:59:16.796360Z", + "iopub.status.busy": "2026-08-06T04:59:16.796155Z", + "iopub.status.idle": "2026-08-06T04:59:16.801820Z", + "shell.execute_reply": "2026-08-06T04:59:16.801375Z" } }, "outputs": [ @@ -825,7 +825,7 @@ }, { "cell_type": "markdown", - "id": "15a1bfdd", + "id": "1771b667", "metadata": {}, "source": [ "```{warning}\n", @@ -844,13 +844,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "685811ea", + "id": "b07f8f0c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:49.927053Z", - "iopub.status.busy": "2026-08-05T21:21:49.926937Z", - "iopub.status.idle": "2026-08-05T21:21:49.929462Z", - "shell.execute_reply": "2026-08-05T21:21:49.929019Z" + "iopub.execute_input": "2026-08-06T04:59:16.803039Z", + "iopub.status.busy": "2026-08-06T04:59:16.802882Z", + "iopub.status.idle": "2026-08-06T04:59:16.805061Z", + "shell.execute_reply": "2026-08-06T04:59:16.804694Z" } }, "outputs": [ @@ -871,7 +871,7 @@ }, { "cell_type": "markdown", - "id": "9d3b0325", + "id": "a314f726", "metadata": {}, "source": [ "## Was it actually amorphous?\n", @@ -884,20 +884,20 @@ { "cell_type": "code", "execution_count": 14, - "id": "40abf45a", + "id": "50ad7eed", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:49.930478Z", - "iopub.status.busy": "2026-08-05T21:21:49.930365Z", - "iopub.status.idle": "2026-08-05T21:21:50.847974Z", - "shell.execute_reply": "2026-08-05T21:21:50.846405Z" + "iopub.execute_input": "2026-08-06T04:59:16.806584Z", + "iopub.status.busy": "2026-08-06T04:59:16.806433Z", + "iopub.status.idle": "2026-08-06T04:59:17.756471Z", + "shell.execute_reply": "2026-08-06T04:59:17.743276Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 14, @@ -938,7 +938,7 @@ }, { "cell_type": "markdown", - "id": "8722dbab", + "id": "f7cab951", "metadata": {}, "source": [ "The crystal's shells stay sharp out to 8 Å. The quenched structure keeps its\n", @@ -947,19 +947,103 @@ "beyond it. Short-range order without long-range order is the definition of a\n", "glass, and this is what it looks like as a measurement.\n", "\n", - "## What the object remembers" + "### What a diffractometer would actually see\n", + "\n", + "g(r) is not what a total-scattering experiment reports. `mv.prop.scattering`\n", + "applies the two standard transforms — the structure factor S(q) and the reduced\n", + "pair distribution function G(r) — so a quenched structure made here can be\n", + "compared against a measured one." ] }, { "cell_type": "code", "execution_count": 15, - "id": "672d05a5", + "id": "4456297a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.849480Z", - "iopub.status.busy": "2026-08-05T21:21:50.849335Z", - "iopub.status.idle": "2026-08-05T21:21:50.854058Z", - "shell.execute_reply": "2026-08-05T21:21:50.852663Z" + "iopub.execute_input": "2026-08-06T04:59:17.757945Z", + "iopub.status.busy": "2026-08-06T04:59:17.757769Z", + "iopub.status.idle": "2026-08-06T04:59:18.000925Z", + "shell.execute_reply": "2026-08-06T04:59:18.000425Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAACI8AAALwCAYAAAAUS8frAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAewgAAHsIBbtB1PgABAABJREFUeJzs3Xd8FHX+x/H3pveENHoNvYmCVAELKrbD3pVT4fTUn/3snnr282ynZ0UURbEh9gpKl460QCAJLUB678nu/v7YZLKBlE2ym90kr+fjkcdjNvud73x3ZndnZ+Yzn4/JarVaBQAAAAAAAAAAAAAAgA7Jy90DAAAAAAAAAAAAAAAAgPsQPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAAAAAAAAAAAAANCBETwCAAAAAAAAAAAAAADQgRE8AgAAAAAAAAAAAAAA0IERPAIAAACHpaWl6cEHH9To0aMVHh4uLy8vmUwmmUwmrVmzxt3DAwAAAADU45577jGO31577TV3D6fN6Wjr77XXXjNe7z333OPu4TjEkW3UFl9XYxx5Tffff7/R5j//+U8rj9C12uM2BQB38XH3AAAAANA27Ny5U6eccorS0tLcPRQAAAAAAAAAAOBEZB4BAKCDWLlypRGFf/LJJ7t7OG7Demi+WbNmtfnAkYCAAGP7V1ZWuns4AAAAAACgHXr22WeN8w8PP/ywu4fTZrDeAMC9CB4BAABAoxITE7V69WpJkpeXl15//XWlpqbKYrHIarXKarVq/Pjxbh4lAAAAAAAAAABoDsrWAAAAoFGbNm0ypqdPn66///3vbhwNAAAAAABwpVtvvVW33nqru4fhdO3xdbXH19QUHf31A4AzkXkEAAAAjcrMzDSm+/fv78aRAAAAAAAAAAAAZyN4BAAAAI0qLy83pn19fd04EgAAAAAAAAAA4GwEjwAA0Ib88MMPuvbaazVs2DCFh4fL19dXMTExGjJkiE455RT985//1OrVq2U2m4153nzzTZlMJk2ePNn437Jly2QymY75OzqjxHfffWc8d/7550uSKioq9N577+nss89W7969FRAQIJPJpKVLlxrzPfbYY8Z8zz77bKOv65NPPjHa//Wvf3VoXaxcuVK33367TjjhBMXGxsrPz0+xsbEaOXKkLr74Ys2dO1dpaWlOWQ+ueD3NXbf29uzZo4cfflgTJkxQ165d5efnp8jISI0aNUp33XWXdu3a1ehYG/LTTz8ZY7zzzjuN/7/wwgvHrLPXXnut1ry5ubn64Ycf9MADD+i0007T0KFDFR0dLT8/P8XExGjMmDG6++67lZCQ0ORx7du3T4899pimTp2q7t27KyAgQBERERo8eLDOOOMM/fvf/1Z8fLzRPjEx0RhnWVmZ8X9fX986t/++ffvqXK7VatWXX36pq666SnFxcQoNDVVQUJB69+6tCy+8UO+//74qKioaHHtpaamxnJCQEOP/ixcv1syZMzVgwACFhobKZDLp4YcfbvK6AQAAANA6xowZY/y2//PPPyVJO3bs0D333KORI0cqKipKJpNJJ598cp3zV1ZW6uOPP9aVV16p/v37KywsTAEBAerZs6dmzJih9957r9HjC3srVqzQNddcYxxLxsbGaty4cfr3v/+tnJwch/uZNm2a8bpWrlzZaPtbb73VaD9nzpxG25vNZn3++ef661//qsGDBysyMlL+/v7q0aOHxowZo1mzZumrr75SUVFRg/146vpz1P3332+st//85z+SpNTUVD3++OM64YQTFBUVpcDAQMXFxWn27NnavHlzo31arVZt375db7zxhq666iqNGTNGvXv3VlBQkEJCQtSnTx9ddNFFDh27StJrr71mjPGee+5x+HVkZmbq+eef16RJk9S1a1f5+PjIZDKpsrKyCWvoWM7aRo68LkkqKyvT3LlzNWPGDPXt21chISHy8/NT165dNXLkSJ177rl66aWXtHPnzlrzXX311TKZTHrggQeM/z311FN1nn84+pxRc9eno6/paC19zznz+6Il662prz8lJUWPPvqoJk6cqC5duhjnqkaPHq1//OMfx2zTutS1rfLz8/Xiiy9qwoQJio2Nlb+/v7p3766LL75Yv/zyS6N9AoAn8HH3AAAAQOOysrJ0ySWX6Pfffz/muczMTGVmZmrXrl1aunSpnnjiCS1atMgISHCmpKQkXXLJJXUeQFqtVqcvry4HDx7UzJkz61wXGRkZysjI0LZt27Rw4UKNHj1aGzZsaJVxtVRT1m15ebnuuusuvfXWW8ecfMnJyVFOTo62bNmi//73v7rrrrv07LPPysurdWOGL774Yi1ZsqTO56rfsxs3btTLL7+se++9V08//bRMJlODfZaVlenuu++u83WXlZUpLy9PCQkJ+vXXX3XfffcpJydHERERTnk9SUlJuvTSS7Vp06Zjnjtw4IAOHDigRYsW6cknn9Qnn3yiMWPGONRvaWmpbrjhBn388cfHPNdanykAAAAALffcc8/pkUceOeaifF2/61etWqW//vWvSkxMPOa5lJQUpaSk6JtvvtHTTz+thQsXauTIkfUu12w265ZbbtFbb71V6//Vx8fr1q3Tq6++qs8//7yZr8x5Vq5cqeuuu67O133o0CEdOnRIGzdu1Lvvvqvbb79dL7/8cp39tMf199NPP+nqq69WVlZWrf8nJycrOTlZ7733nh588EH961//qrePVatW1bph5mhFRUXav3+/vvzySz311FP66quvNGzYMKe9Bkn69ddfdc0119S6madac49x3bGNtmzZogsuuEB79+495rnU1FSlpqZq27Zt+v7773XXXXcpIyND0dHRTlt+NVesz2rOeM+1Rc8++6wef/xxlZaW1vp/9bmqTZs26aWXXtKtt96qF154Qd7e3g71u3btWl122WXav39/rf8fPnxYCxcu1MKFC3XTTTfp9ddfb/T8FwC4E5lHAABoA6644oo6gyVaU15ens4555x67zywWCwuH8OOHTs0evRot68LZ2vKui0tLdXpp5+u//3vf43etWM2m/X888/r+uuvd+p4nclisejZZ5/Vfffd12C74uJinXzyyQ69bmfbs2ePJkyYUGfgyNGSkpI0depUrVq1yqG+Z8+eXWfgiNQ6nykAAAAALffWW2/p/vvvrzObw9G/67/66iudeuqpdQY+HC0xMVGTJk3Stm3b6m1zww03HHNR/WgpKSk699xz682y2Bo+/fRTh193Q9rj+tuyZYsuuuiiYy7i2zObzXriiSeclqEyMTFRU6ZMUUpKilP6k2oCLuoKdJCaf4zb2tsoLy9PZ511Vp2BI63JVeuzuu/Wfs95gjvuuEMPPPDAMYEjRzObzXrllVd0ySWXOBSks2PHDk2fPv2YwJGjvfnmm/rf//7XpDEDQGsjeAQAAA+3fft2/frrr8bjv/71r1q2bJkyMzNVWVmpvLw87d69W8uXL9eTTz6piRMnysenJrnYTTfdJKvVqhUrVhj/mzp1qqxW6zF/DZ18Wbp0qRISEhQZGannnntOu3btUklJiTHvaaed5poVUCU/P18zZsxQRkaG8b/p06dr0aJFOnTokMrKypSRkaGtW7dq4cKFuv7669WlSxejrbPWgys0Zd3eeuutWr58uSTJ29tbM2fO1C+//KL09HRVVFQoJydHv/32my655BJjnnnz5umjjz5q8rimT59ujOGll14y/n/33Xcfs85uvfXWWvNGRkbqwgsv1Ouvv641a9YoKSlJ+fn5Ki8v18GDB/XFF1/USt/8n//8x0j1XJcbbrhBa9asMR4PGTJEb731lnbv3q3i4mLl5+cbWUfuvfdeDR061LiTo3///sY4/f39jT4qKirq3P59+vQx2pjNZl1xxRW13neXX365VqxYofz8fBUVFWnjxo26+eabjbtRiouLdcUVVygvL6/B9VtUVKT58+fL29tbN998s9asWaO8vDxjHM8880yD8wMAAADwDG+++aYk2zHUTz/9pMzMTFkslmOOQXft2qVrrrlG5eXlkmzHKq+99pp27typoqIilZWVKTExUa+++qpxPFtYWKhLL720Vnnaap9//rnmzZtnPB4yZIgWLFig1NRUlZWVae/evXr55ZcVFRWlrKwsLVy40JWroV5btmzRddddZwTX+Pr66m9/+5t+++03ZWZmqry8XIcPHzayjpx//vm1ynxWa6/rb/78+SouLlbPnj01Z84cpaSkqKysTAcPHtTbb7+t7t27G22feeaZesuDeHl5adSoUbrnnnv0/fffa+vWrTpy5IjKy8uVn5+vjRs36pFHHlFYWJgkKTs7W7fddptTX0dRUZEGDRqkefPm6eDBg7WOu+2Pxx3ljm20YMECHTlyRJIUGBioRx99VJs2bVJeXp4qKyuVmZmpHTt26Mcff9Tdd9+tIUOG1MokMX/+/GOO6R966KE6zz+8//779Y7DFevTvm9nvOecyVnrrT5ff/21XnnlFeNxt27d9Prrr2v//v0qKytTamqq5s+fr4EDBxptFi1aVOt8WH3ef/995ebmasSIEZo/f75SUlJUXl6u9PR0zZ8/X926dTPaPvnkk00qqQUArc4KAAA82ieffGKVZJVkvfTSS5vdz4oVK4x+pk6d6tA83377rTGPJGvnzp2tSUlJjc736KOPGvM888wzjbZfsGCB0X7mzJl1tnn88ceNNiaTyfr222879BqO1pz14IrX05x1u3nzZqN9UFCQ9ffff2+w/SuvvGK0HzRoUKPjbshLL71k9HX33Xe3qC97t9xyi9Hv7Nmz62yzevXqWuvq2muvtZaVlTVref7+/kY/FRUVjbb//PPPay37xRdfrLftZ599ZjWZTA2+V0pKSmr1ZzKZrIsWLWrWawEAAADgPqNHj6712/4f//hHo/PMmDHDaH/BBRdYS0tL622bnp5uHTRokNH+448/PqbNkCFDjOcnTpxoLSgoqLOvxMREa5cuXWqN99VXX62z7WmnnWa0WbFiRaOvyf6Y7p133qmzzemnn260iYiIsP7xxx+N9luXtrD+HHXffffV6m/w4MHW9PT0OtumpqZaBwwYYLQ97bTTWrTshIQEa6dOnaySrF5eXtYDBw7U2e7VV19t9DzA0a9j8uTJ1sLCwhaNz54rtlFjr+vWW281nv/vf//b7LE/88wzRj8PPfSQQ/M0d302Z1s54z3niu+L5qw3R17/8OHDjTYDBw60HjlypM52+fn51vHjxxttIyMjrUVFRce0O3p9nnfeefV+JyUkJFgDAgKMto2dzwMAdyLzCAAAHs7+ToLOnTu7cSTSSy+9pH79+rX6cq1Wa620jnfccYdmz57d6uNwJUfWrf0dEo899litzB11ue222zR+/HhJUkJCgnbs2NHicTrb888/r9DQUEnS4sWL62zz3//+15g+4YQTNGfOHPn5+bXK+ObOnWtMn3nmmbrzzjvrbXvJJZdo1qxZxuN333230f6vu+46nX/++S0aIwAAAAD3GjJkSKOZA/ft26dvvvlGkhQbG6sPP/ywwcwBMTExevnll43HX375Za3n161bp507d0qSfHx8NH/+/DqzdUhSXFycXn31VUdeitNVZ4is9u677xrHqU3R3tff3LlzFRMTU+dznTt31pw5c4zHS5Ys0YEDB5q9rIEDB+quu+6SZCt94qzSwN7e3vrggw8UHBzslP7ctY085Tycs9fn0VrzPedu69at0/bt243H8+bNq5Wt2F5oaKgWLFhgnHfKzs7WokWLGuw/PDxc8+bNq/c7aeDAgbXO/ThSFhkA3IXgEQAAPNxJJ52kgIAASdI777yjN954Q/n5+a0+jtDQ0FqlUFrTli1blJ6eLsl28PzAAw+4ZRyu4ui6tQ+uuOaaaxzq+/TTTzem161b1/TBuVhgYKAGDx4sSdq7d+8x722r1aolS5YYj++77z75+vq2ytgsFotWr15tPHYkna99cEliYqKR6rY+119/ffMHCAAAAMAjzJw50yhjWZ/FixfLarVKki688EKHLgifdtpp8vKyncI/+njOvhzO9OnT1bdv3wb7uvDCC9W1a9dGl+ls9oEjQ4YM0YUXXtisftrz+hs1apQmTJjQYJspU6Zo+PDhxuNVq1a1aJknnHCCMd1QCdmmOOWUU2qVgW0pd22jadOmGdPVJYDcUWbE2evTnjvec+5k/1468cQTGw1g69OnT61gj+ry0fU599xz1alTpwbbjB492pi2L40MAJ6G4BEAADxcdHS0nn/+eZlMJpWWlurmm29WVFSUxo0bp5tvvllz5szR7t27XT6OESNGyMfHx+XLqYt9xozjjjuu3jsj2ipH1m1mZqZSUlKMxz169JCPj498fHzk7e1t/Hl5ecnLy0smk0kmk0lPPPGEMU91AE5rMZvN+uabbzRr1iyNGTNGMTExCggIMMZW/bd+/XpjnqysrFp9pKen1zqotg+GcbW0tDTl5eUZj0866aRG5xkyZIiio6ONxwkJCQ22tz9hBwAAAKBtcuR3vf0F+rfffts4nrM/pqs+nqs+pvPz85PFYpF07PHcrl27jOlJkyY1unwvL69GLxa7gv3xfEuO59rz+nNk+ZI0ceJEY9p+/Efbt2+fnn32WZ111lnq27evwsLC5O3tXes4/JxzzjHaH30c3lzOPr511zaaPn26Lr/8cknSwYMHde655yoyMlLTpk3Tvffeq88++0xpaWktXk5jXHm+wNnvOU9nf9508uTJDs1j366xczuDBg1qtL/w8HBjurCw0KExAIA7uOcKEAAAaJJbb71VQ4YM0b/+9S+tWLFClZWVWrduXa07ZwYNGqTZs2fr5ptvVmBgoNPHEBkZ6fQ+HWV/IqNHjx5uG4erOLJuMzMzaz02m81NXk5rHpxu2bJFV155peLj45s0X0FBQa3H9ts+KCio0Ts5nCk7O9uYDg4OVlhYmEPzdevWzdhe9n0cLSAgwCWfVQAAAACtq6nHdNUBDU1RWloqs9lsZDjJyckxnnM024I7Mo8463i+Pa+/5iy/rmNNi8Wihx56SC+88EKTMmUcfRzeXM4+b+TObfTxxx/r1FNP1QsvvKCEhAQVFhZqyZIlRmZUk8mkSZMm6bbbbtPFF18sk8nklOXac+V5OGe959oK+7E7+tq7d+9e5/x1ceTcjv17pDqLEgB4IjKPAADQRpx22mlatmyZUlJStGDBAt15552aNGmSUU8zISFB99xzj44//ngdPHjQ6ctvLAWvK9kfVLnigNzdHFm3lZWVLV5Oax2c7t+/X1OnTm1y4Ih07ElAd257Vy/bnZ8pAAAAAM7TVo7p3HHB0lnHVR11/dW3/LrW5d13361nn322ySVWmhOMUxdPOMZ11jYymUyaPXu2du3apfj4eL399tuaPXu2RowYIZPJJKvVqpUrV+rSSy/VjBkzVF5e7pTl2vO09dmWz8e1l9cBAK2B4BEAANqYbt266fLLL9eLL76olStXKjs7W1988YWGDRsmyRZEcu2117p1jE2Npi8uLm7wefsyIK4IjGmMs19Pc9ivg8DAQFksFlmt1ib9Pfnkk04fV10effRRo9xLSEiI7rnnHv38889KTk5Wfn6+ysvLa42roVqz9q+7qKio1p1HrhYVFWVMFxYWOnw31pEjR4xpd2bsAQAAAOA57I9tnn322SYfz1mt1lrlTu2zMtofgzQkNTW10TaeejzfVtZfczRn+Udn5UxOTtZ///tf4/GkSZP07rvvatOmTUpNTVVpaWmt8wg//fSTcwbvQp6yjYYMGaLZs2fr7bff1tatW5WWlqZXX33VOGfw7bff1ioZ3BY44z0necb5MkfYn985fPiwQ/PYt+PcDoCOhOARAADauKCgIF100UX67bffFBwcLElaunSpDhw4UKtda0bWBwUFGdPVQQQNsa89Wpfhw4cb01u2bFFGRkazx9ac9eDs19McsbGxxsFuSUmJNm7c6PRlOMv3339fa/r555/XGWecob59+yo0NFS+vr612jd0AjE2NlaxsbHG419//bVFY2vK9u/cuXOtmrQrVqxodJ5du3bVen86UvcWAAAAQPs3dOhQY9qRY4vGDB482JhetWpVo+0tFov++OOPRtu58nh+8eLFjfZXn7ay/prDkeVL0urVq41p+/FL0o8//mhkEJk2bZqWL1+u66+/Xscff7w6d+4sf3//WsfD7rgxp6k8aRvZi4mJ0a233qqPP/7Y+N+8efOOaefJGS6c8Z6TXHO+zBXrbeDAgca0o98f9u04twOgIyF4BACAdiI2NrbWwVBycnKt56vL20hySTrNo8dSrbEgh/Lycn366acNthk5cqQ6d+4sSTKbzXrmmWeaPbbmrAdnv57m8PLy0umnn248fvbZZ52+DGeoqKgwalEHBwdrypQpDbZfunSpDh06VO/zJpNJp512mvH4ueeea1G64qZsfy8vL02aNMl4/NprrzXa/yuvvGJM9+/f3y01xQEAAAB4njPPPNOY/umnn7Rly5YW9XfSSSfV6m/v3r0Ntv/yyy8dyjbQlOPfPXv2aM2aNQ22sT+OjY+P15dfftnoGOrSVtZfc/z555+NrscVK1Zo+/btxmP7Y1WpdpaEM888U15eDV/6+eijj5ox0tblSduoLvbjO3jw4DHlglrzPFxTOeM9Jzn/+0JyzXqzPze1fv16rVu3rsH2Bw4c0FdffVXn/ADQ3hE8AgCAh3vppZf0n//8RyUlJQ22S0lJ0a5du4zHYWFhtZ63Ty+ZlJTk0lq9o0ePNqZ/++03bdiwoc52FotFt9xyi/bt29dgfyaTSbfeeqvx+OWXX9acOXOaNbbmrAdnv57muuOOO4zphQsX6uGHH3aoNvGvv/6qa665xiVjOpqvr69xoF9UVNTgCb29e/fquuuua7TP2267zZjetGmTbrjhhmafQLDf/omJiY22tx/fjz/+qFdffbXetl9++aXeeust4/GsWbOaNUYAAAAA7c+gQYN01llnSbLdFHH++ecrISGh0fmys7N177336rvvvqv1/3HjxhmZACorK3X11VerqKiozj6Sk5NrHVc1xP749+2331Zubm6d7fLy8nTVVVfJbDY32N/AgQNrBX7MmjXLoQvIR2sr66+5rrvuunqzrKalpemGG24wHp966qnq1atXrTYhISHGdGNZJR5//HEtXbq0+YNtJe7aRjfddJMWLlzY6Pki+0w6gYGBx2RZber5h9bW0vec5PzvC8k16+3EE0+slQVp5syZSk9Pr7NtYWGhrrzySpWVlUmylay54IILnDIOAGgLCB4BAMDDZWVl6R//+Ie6deumm2++WV999ZUOHjyosrIyFRQUaPfu3XrllVc0adIkI8AkJiZGI0eOrNVP3759jbI26enpevjhh5WSkuLQgVtTDR8+3EjpaLFYNH36dM2ZM0dpaWmqrKxUenq6Fi1apMmTJzscBHL77berf//+kmx1VGfPnq1zzjlHX3/9tY4cOaKKigplZWVpx44d+vLLLzVr1iydd955x/TTnPXgitfTHOPGjdP1119vPH7qqac0evRovfXWW4qPj1dRUZEqKyuVkZGhlStX6umnn9awYcN0xhlnaPPmzS4b19EmTJhgTJ955pl65ZVXlJycrNLSUhUVFWnz5s365z//qVGjRjkUaDN+/HhdddVVxuMPPvhAxx9/vN555x0lJSWptLRUhYWF2rNnj5YsWaL7779fw4cPrzNlqv3Jgvvvv187duxoMBDlggsuqHUy5LbbbtPVV1+t1atXq7CwUCUlJdq8ebP+7//+T5deeqlxcqlnz5666aabGn1tAAAAADqO//znP8ZF/n379um4447TzTffrMWLFys9PV2VlZUqLCxUYmKiFixYoGuuuUbdu3fX888/r9LS0mP6e/TRR43p1atX68QTT9Snn36qjIwMVVRUaP/+/frvf/+rcePGOZyRYcaMGfLx8ZFky2YxZcoUfffdd8rLyzP6fPvttzVq1CitX7/eoT7//e9/KzAwUJKUk5OjqVOn6qabbtLSpUuVnZ2tiooKpaamavPmzZo7d64uvPBCPfLII21y/TXXrl27NGbMGM2dO9c4x3Ho0CHNmTNHY8aM0Z49eyTZbq6xH3e1iRMnGtNfffWVLr74Yi1dulSZmZmqrKzUkSNHtHDhQp188sl67LHHXPpanMkd22jXrl26+OKL1a9fPz3yyCP67bfflJaWZpx32rRpkx588EFdccUVxjz2GVOr2Z9/+P777/XRRx8pOzvbpTdzNUVL33OSa74vXLXennjiCWN6165dGj16tN5++22lpKSooqJC6enp+vjjj3XiiSfWCsB66KGHapXnAYB2zwoAADzaQw89ZJXUpL/333+/zr4uv/zyBueLi4ur1f7bb781npsxY0aTxv3pp586NFZ/f3/r3//+d+PxzJkz6+1z+/bt1piYGIfXw+jRo52yHlzxepq7bsvKyqxnnnlmk98Tw4YNc3gZdXnppZeMvu6+++4G2/74448Oj2vChAnW0aNHG483b95cZ59FRUXW8ePHN+k15+TkHNPPnDlzGp1v7969tebZvXu3NTo62uHlBgUFWVeuXFnn6ygpKTHaBQcHO7LqAQAAAHggR45j6vLDDz9Yg4KCmnxM9/nnn9fZ39VXX+3Q/FFRUdaLLrrIePzqq6/WO8b/+7//c6jPXr16WS+88ELj8TvvvFNvn5988onV19fX4dd7++23t9n154j77rvP6Ouqq66yBgYGOjSO+++/v87+LBaLdcKECQ714eXlZb3llluMx/Wdk3j11VeNNvWdB7B/Hc8//3yL1kl9nL2NGntdU6dObdJ7KzAw0Lpt27Zj+jGbzdZevXo1OO/R54yauz6buq2c8Z6r5uzvi+asN0dev9Vqtd5+++1N2rbnn3++1WKxNLo+HdlW77zzjtH+lltuabQ9ALgLmUcAAPBwd999t+6///5aKUjrExoaqjlz5mjmzJl1Pv/000/XqkfqSpdeeqn++c9/NtgmOjpaixYtcrh26LBhw7RhwwZNnjy5RWNrznpwxetpDj8/P33//fd69NFHHb7z4eyzz9bHH3/ssjEdbfr06XrxxRfl7e3dYLvTTz9d33zzjQICAhrtMygoSL///rtuvPHGRvttyMyZM5u8fQYMGKA1a9bo+OOPb7RtXFycli1bVmctYAAAAAA466yztHbtWo0ZM8ah9jExMXrhhRfqzKwpSe+9916jJTO7deumb775Rn369HFomc8995zOPffcBtuMGDFCv/76q7p27epQn5dddpl+/fVX9e3b16H29WkL66+pRo0apYULFyoyMrLeNl5eXnrggQf0zDPP1Pm8yWTSF198UStrQ11CQ0P1/vvv6/zzz2/JkFtVa2+jd955R1deeaVD5x769OmjxYsX17nevby89L///e+YcjaewBnvuWrO/r5w5Xp7+eWX9fTTTxvlluvj7e2t2267TZ9//rlMJpPTxwEAnozgEQAAPFynTp30zDPP6MiRI3r33Xd10UUXqVevXvL391dAQIC6d++uM844Q88//7wSExNr1SQ9Wt++fbV161Y9/PDDGjt2rDp16mSkl3SFxx9/XKtXr9aVV16pnj17yt/fXxERERo1apQee+wxbd++3ahZ7KhevXpp+fLlWrJkiW688UYNGzZMnTp1kq+vr7p06aKRI0fqkksu0dy5c/X999/X2Udz14MrXk9zeHt7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8Eh9mUckqVtEzY7mEKVrAAAAAAAAAAAAgFaz41CeMT28oeCR8Jpreql5ZfW2A9o7gkdcrLS0VDNmzNDixYslSX/729/09ttvNymww8fHRzNnzpQkbd++XV9//XWd7Z588kmjPMoNN9zQwpGjPrUyj4T41duua1XmEUk6kkfwCAAAAAAAAAAAANBatjkaPGJXaYDMI+jICB5xobKyMl1wwQX69ddfJUk33nij3nzzzWZlBHnooYcUExMjSbr++uv1yy+/GM9VVFTomWee0bvvvitJmjFjhk455RQnvALUJbPQwbI1dplHDuexowEAAAAAtA1Wq1WVlZVN+jObze4eNgAAAADUsv1QviTJyyQN7RpWb7su9plHCB5BB+bj7gG0Zy+//LJ++uknSZK3t7f27Nmj008/vcF5Zs2apcsvv/yY/0dGRurbb7/V6aefruzsbJ155pmKi4tTly5dlJCQoMzMTEnSqFGjNG/ePOe/GBgyC8qN6YbL1tRkHjlM2RoAAAAAQBuxbNmyJt+U0rt3b+3bt6/e5ysrK/X2229rwYIFio+PV15enmJjYzVx4kTdeOONjZ4vAQAAAICmKK0wa3dagSSpf2yIAv28623bOawmeCSd4BF0YASPuFBJSU3AgNls1m+//dboPNOmTav3uXHjxmnr1q2699579c033ygpKUlJSUmSpNjYWM2aNUuPPPKIAgIC6u0DLZfhYOaRWmVrCB4BAAAAALQRJpNJ3t71n1itZrVaZbFYJEkDBw6st116erqmT5+uzZs31/r/kSNHtHDhQi1cuFA33XSTXn/99WZlawUAAACAo+1OK1ClxSqp4ZI1Uu3gETKPoCMjeMSFrr32Wp100klNmmfAgAENPt+nTx999tlnKiwsVHJysnGnTv/+/R06sYOWyyyoCR5pOPMIZWsAAAAAAG3P1KlTVVlZ2Wi7K664Qp988okkWybVulRWVuqcc87R5s2bZTKZdP/99+vmm29W586dtWPHDj344IP68ccf9eabbyoqKkpPPvmkU18LAAAAgI5p26E8Y3p4t4aDR2JC/WUySVarlJpf1mBboD0jeMSF+vXrp379+rmk75CQEI0cOdIlfaNh1ZlHgvy8Fexf/0coyM9HEUG+yi2uoGwNAAAAAKBdyc7O1qJFiyRJ0dHROv/88+ts99Zbb2nDhg2SpCeffFIPPvig8dyoUaP07bff6pRTTtGKFSv073//WzNnzmz0xhoAAAAAaMx2u+CRET0aDh7x9fZSVLC/MgvLKFuDDs3L3QMA2prMquCRhrKOVKsuXZOWXypLVWosAAAAAADauo8++khlZbbj42uvvVZ+fn51tnv55ZclSV26dNE//vGPY5739vbWc889J0mqqKjQ66+/7poBAwAAAOhQth/KlySZTNLQrmGNtu8Sbrvul15QJjPX9NBBETwCNEF5pUW5xRWSpOiQuk+M2esWbitdU2G2GkEnAAAAAAC0de+++64xXV/Jmq1btyoxMVGSdNFFF8nX17fOdhMmTFCfPn0kSV9++aVzBwoAAACgw7FardqdViBJ6hsV3GAlgWqdQ23X9MwWq7KKuKaHjongEaAJ7HcWMaGNZx7pFhFoTB+idA0AAAAAoB3YsGGDtmzZIkmaNGmShgwZUme79evXG9MTJ05ssM9JkyZJkg4cOKD09HQnjRQAAABAR1RYVqmySoskqWtEgEPzdA6vaZeWR/AIOqbGw6wAGDIKanYWDpWtsdshHckr1fEuGRUAAAAAAK3HPuvI7Nmz620XHx9vTMfFxTXYp/3z8fHxio2NdXg8KSkpDT5/5MgRh/sCAAAA0PZlFZYb01HBjV/Pk6QuYTXX9FLzSzVC4U4fF+DpCB4BmsC+9IxDmUfCazKPHCbzCAAAAACgjSspKdGCBQskSWFhYbrkkkvqbZuZmWlMNxYM0rlz5zrnc0TPnj2b1B4AAABA+2ZfSSAqxM+heTqH1Vz3S8svdfqYgLaAsjVAEzQ184h92ZrDuexoAAAAAABt2xdffKG8vDxJ0lVXXaWgoKB62xYUFBjTDbU7+nn7+QAAAACgqTLtMo84cj1PkjrbZR4heAQdFZlHgCaw39k4knmka7h92RoyjwAAAAAA2jb7kjWzZs1yeD6r1dqi5xty8ODBBp8/cuSIxo4d2+z+AQAAALQttcvWOJp5hOARgOARoAmamnmkS3iATCbJapUO57GjAQAAAAC0XYmJiVq+fLkk6YQTTtAJJ5zQYPvQ0FBjuqSk4Rsq7J+3n88RPXr0aFJ7AAAAAO1bVqF92RrHMo90sQseSc0va6Al0H5RtgZoggy7nU2sA5lHfL29jHaHc8k8AgAAAABou+bOnWtkCJk9e3aj7WNiYozptLS0BtumpqbWOR8AAAAANFVWkV3mkRDHMo9EBPnKz8d26TydzCPooAgeAZogs4mZRySpa3igbd7CMpVXWlwyLgAAAAAAXMlsNmvevHmSpKCgIF155ZWNzjN06FBjOjExscG2SUlJdc4HAAAAAE2VaXczeHSwY9fzTCaTOofZ2qYSPIIOiuARoAmqM48E+3kr0M/boXm6RdjSXFmt1EgDAAAAALRNP/74ow4fPixJuvTSSxUWFtboPGPHjjWmV69e3WDblStXSpL69OlD5hEAAAAALZJV2PTMI1JN6Zrc4gqVVpidPi7A0xE8AjRBdeaRGAdK1lTrVpV5RJIOUboGAAAAANAGzZkzx5h2pGSNJA0fPlyDBg2SJC1cuFDl5eV1tlu5cqUOHDggSbroootaOFIAAAAAHV1Wke16XoCvl4IcvBlckmKrgkckKT2/rIGWQPtE8AjgoNIKs/JLKyU5XrJGkrpG1ASPHMkjeAQAAAAA0LakpaXp+++/lyQNGTJEEydOdHjeO+64Q5KUnp6up59++pjnKysr9Y9//EOS5Ofnp5tvvrnlAwYAAADQoVVnHokK9pfJZHJ4vi52wSOUrkFHRPAI4KCsopo7pJqWeaRmR3M4lx0NAAAAAKBtmTdvniorbTdTOJp1pNrs2bM1YcIESdLjjz+uu+66S4mJiSosLNSaNWt05plnas2aNZKkhx9+WP369XPu4AEAAAB0KGaLVdnFtmt60U24nifVDh5JI3gEHRDBI4CDMgpq0lM1JfNIZ7vgEfs+AAAAAABoC+bOnSvJlhnk2muvbdK83t7e+vbbbzVu3DhJ0ksvvaQBAwYoNDRUEyZM0G+//SZJuv322/XII484d+AAAAAAOpzsonJZrbbp6GC/Js0bG1Zz/Y/gEXREPu4eANBWZNoFfjQl80iMXaBJRiHBIwAAAACAtmP16tVKTEyUt7e3LrroIkVFRTW5j6ioKK1atUrz5s3Txx9/rPj4eOXl5Sk2NlYTJ07UjTfeqClTprhg9AAAAAA6mqyimmtxUSFNCx6pVbYmj+ARdDwEjwAOsg/8aErmEfsdUxbBIwAAAACANmTixIlGyZqW8Pb21vXXX6/rr7/eCaMCAAAAgLplFZYb01FNuJ4nSZ3ty9ZQTQAdEGVrAAc1N/NIkJ+Pgvy8bX3Y7bAAAAAAAAAAAAAAOE+m3Y3cUU0sW1MreITMI+iACB4BHJRZK/NI03Y21ZlKyDwCAAAAAAAAAAAAuIZ95pGmVBKQpEA/b4UF2Ap3pBUQPIKOh+ARwEHNLVsj1ZSuySmuUIXZ4tRxAQAAAAAAAAAAAJCyiuwyjzTxZnBJ6hJuyz6Smlcqq9XqtHEBbQHBI4CD7EvONKVsjVQ72CSniNI1AAAAAAAAAAAAgLPZZx6JCm7a9TyppnRNWaVFeSUVThsX0BYQPAI4KL9qBxHg66UAX+8mzWtf5iaD0jUAAAAAAAAAAACA02XWKlvT9Mwj1cEjkpSWzzU9dCwEjwAOqg4eCQ3wbfK89pGN9hGPAAAAAAAAAAAAAJzDvmxNp+BmlK2xCx5JzS91ypiAtoLgEcBBBaWVkqSwAJ8mz2sf2ZhJ5hEAAAAAAAAAAADA6apv4o4I8pWvd9MvhXcOq7khPI3gEXQwBI8ADjBbrCooswWPNCvzSAiZRwAAAAAAAAAAAABXyqq6iTuqGVlHpKPK1uQRPIKOheARwAGFVYEjkhQW2PTgkWi74BEyjwAAAAAAAAAAAADOVVJuVlG5WVLtG7uboks4ZWvQcRE8Ajggv6TCmA5tcdkaMo8AAAAAAAAAAAAAzpRVVHMDt/21uaaolXkknxvC0bEQPAI4IL+0JngkrBlla8g8AgAAAAAAAAAAALhOlt0N3FHBzcs8Eh3iLy+TbTqNzCPoYAgeARxQUGpXtqYZmUfCA33lXbWnsY96BAAAAAAAAAAAANBytTOPNC94xNvLpJhQ27wEj6CjIXgEcIB92ZqwwKZnHvHyMikq2JYeK4uyNQAAAAAAAAAAAIBTZdpnHmlm2RpJ6lJVuiazsEyVZkuLxwW0FQSPAA6wzzwS2ozMI5IUVRXhmFVYLqvV6pRxAQAAAAAAAAAAALAFe1SLbkHwSOeq4BGLVcoopKIAOg6CRwAH5JfaZR4JaHrmEalmJ1VutijfLhgFAAAAAAAAAAAAQMtk1co80ryyNVJN8IgkpeUTPIKOg+ARwAHOyDxiX1stkyhFAAAAAAAAAAAAwGmy7K6/RQW3oGxNeE3wSGpeaYvGBLQlBI8ADsgvscs8EtiyzCNS7chHAAAAAAAAAAAAAC2TVeSczCOxoTXzphcQPIKOg+ARwAHOyDwSReYRAAAAAAAAAAAAwCUyq27e9vU2KayZ1/MkMo+g4yJ4BHBAfqld5pGA5mYeqQkeySJ4BAAAAAAAAAAAAHCa6utvUcH+MplMze6nc5hd8Eg+wSPoOAgeARxgn3mkuWVrouzK1mRQtgYAAAAAAAAAAABwCovFquyqsjX21+Sawz54JD2fG8LRcRA8AjigOvOIl0kK9vNuVh8xZB4BAAAAAAAAAAAAnC6/tEKVFqskKcrumlxzhAX4KNDXdj2QzCPoSAgeARxQnXkkNMC32Wmu7KMcMwkeAQAAAAAAAAAAAJwi0y7rf3RwyzKPmEwmdQ6zBaCkETyCDoTgEcAB+SW2zCOhAT7N7iMq2D7zCGVrAAAAAAAAAAAAAGewz/rf0rI1Uk3pmoLSShWXV7a4P6AtIHgEaITVajUyj4QF+Da7Hz8fL4VVBZ+QeQQAAAAAAAAAAABwjqyimhu3W1q2RqoJHpGk1Dyyj6BjIHgEaERZpUXlZouklmUekaToUNvOiswjAAAAAAAAAAAAgHPUyjzSwrI1khQTWhOAkl3EdT10DASPAI3IL60wpsMCm595RJKiq0rXFJRVqrTC3KK+AAAAAAAAAAAAAEiZdjduRzsh80inoJprgrnFFQ20BNoPgkeARuSX1NQxa2nmEfsaa1lEKQIAAAAAAAAAAAAtllVUk3nEGcEj4UE11/RySwgeQcdA8AjQiFqZRwJamHnEbmeVWVDWQEsAAAAAAAAAAAAAjsiyyzxifzN3c0UE2mce4YZwdAwEjwCNKCityTwS5tTMIwSPAIA7lFaYlZ5f6u5hAAAAAAAAAACcxD54JDLYCcEjdmVr8sg8gg6iZVfCgQ4g326HEBbozMwjRCkCQGsqLKvUvNX7NGdFsnKKK3TyoBjdftoAHd+rk7uHBgAAAAAAAABogcxC203bof4+CvD1bnF/EYF2ZWuKCR5Bx0DwCNAI+8wjoS3MPBJdK/MIwSMdTVZhmRZtPqTUvFKVVJhVXmnRwM6hmja0s/pGB7t7eEC79vmGg3rqh521fuQvTcjQ0oQMnTIoRv+55DhFOaEOJgAAAAAAAACg9VUHjzijZI1UO/NILplH0EEQPAI0Ir/ULvNIQMsyj3QKqtlh5VAfrcPIK6nQnBXJmrtyr4rKzcc8/9QPO9U/NkRXju2lq8b3kr9PyyNiAdRYk5ylexduldVqe+xlkiKD/Y2Did8TMnTXZ1v0/nUnymQyuXGkAAAAAAAAAICmKq+0KL/qZnBn3SQYbh88wjU9dBBe7h4A4OkK7IJHQlsYPGJfYy2bzCMdwoZ92Zr6/O969bfEOgNHqiWmF+pf38Xr1P8s05ebUmS2WFtxlED7VVBaoXs+32IEjpw9oot+vWuqVt9/qp65cITxvbxsd4Y+XnfAjSMFAAAAAAAAADSH/TW3qGDnZB4J9feRt5ftZsM8Mo+ggyDzCNCI/JKasjVhgS37yHSy22HlEDzS7iWkFuj699cb0a6+3iZddmJPnTeym4L9be+llYmZ+jU+TRv350iSDuWW6K7PtujDNfv1wiXHqV9MiNvGD7QHT363Uyk5JZKksX0j9eoVJxg/+K8Y20tdwgN03XvrJUlPfb9TJ/WPVu8oykgBAAAAAAAAQFtRnWVacl7mEZPJpPBAX2UXldcqhw60Z2QeARpR4MSyNRGBNfNnk+KqXTucW6KZc9cZgSMT46L0290n68nzR2hcvygN7x6u4d3DddPUOC38+0R9f9tJmjowxph/84Fcnf3fFXp/1V5ZyEICNMvi+DR9uuGgJCnYz1svXHKcEThS7ZRBsbpibC9JUnG5Wfd8voXMPwAAAAAAAADQhmTZ3bAdHeKczCNSzXW9HK7poYMgeARoRPXFf0kKDWhZ5hEfby+FV+9oyDzSbuWXVujaueuUml8qSRrZI1zvXDtGPSOD6p1nWLdwzbt+rD6ePU59o21ZD0orLHrs23hd/e5apeQUt8rYgfaiwmzRP7/ebjx++Nyh9X4GHzpniHpGBkqS1u/L0cJNKa0yRgAAAAAAAABAy2XZZx5xUtkaSQoPsl3TKyitVKXZ4rR+AU9F8AjQCPvMI6EtzDwiSZFVO61sgkfarZd/3aPE9EJJUp+oIM3964lGmZrGTIyL1ve3naSZE3ob/1udlKXpL6/QZ+sPymolIwLgiJ93pOpwni2A66T+0br8xJ71tg3x99FzF400Hs9duZfPGgAAAAAAAAC0EVmFNdfcnFW2RqpdUcD+ZnOgvSJ4BGhEfoltZxDg6yU/n5Z/ZDpVRSnml1aqgijFdmdfZpE+XLNPku09M+/6sYpu4g+VID8fPT5juD6aNU7dwgMkSYVllbp34VbdMG+D0qsymgCo3/ur9hnTN58cJ5PJVH9j2QK3jusZIUnalVqgdXuzXTg6AAAAAAAAAICzZBbZZR5xZtmaoJq+cildgw6A4BGgEdWZR8KckHVEqsk8Ikm5xRUNtERb9O+fd6nCbMtYMHtyP/WOCm52X5P6R+unO6foktE9jP/9titdp7+0XN9sOdzisQLt1baUPG3YnyNJGtg5RBPiohya77qJfYzpeX/sc8HIAAAAAAAAAADOZp95pKk39DYk3C7zSG4J1/TQ/hE8AjSiOg1VaIBjZUca08kuSjGHKMV2ZeP+bP2wLVWS7cfJjVPjWtxnWICvnr/kOM25dozxgyevpEK3LdisWz7eRPkjoA7vr95nTP91Yt9Gs45UO3tEV+Nz9vOONB3OLXHF8AAAAAAAAAAATpRVaJd5JNiZmUdqgkfyuCEcHQDBI0ADzBarCstswSNhgc7PPMKF//bDarXqye93Go/vOn2gQvydE3AkSdOGdtavd07ROSO7Gv/7fusRnfHScv0an+a05QBtXWZhmb6tyswTHuirC47v7vC8fj5eumpcL0m27//5a/a7ZIwAAAAAAAAAAOfJqrre5mWqXWqmpSJqZR7hmh7aP4JHgAYUVmUdkaRQJ5Wt6WQXPJJD8Ei7sXR3hjYfyJUkDYgN0aVjejQ8QzN0CvbT/648Qa9ecbwR7ZpZWKbZH2zQHZ9sJhgJkLRg7QGVmy2SpMvH9lSgn3eT5r9qXC/5eNkylSxYd0ClFWanjxEAAAAAAAAA4DzVZWsig/3l7eVYJmpH2Aei5JJ5BB0AwSNAA/JLa3YEYU4qWxNpt6PJpmxNu7Fg7QFj+u4zBsrH23Vfr+cd102/3DlFpw2ONf731Z+HdfqLy/TtlsOyWq0uWzbgyaxWqz5Zf1CSLcL8mvG9m9xHbFiAkeEnp7hCP+9IdeoYAQAAAAAAAADOY7ValVlVtiY6xHlZRyQp3K5sDcEj6AgIHgEaYB88QuYR1Ce9oFRLdqVLkmJD/TVtSGeXLzM2NEBzZo7R8xePNAKbsorK9X8LNutvH25UWn6py8cAeJotKXk6lFsiSZo8IEY9OgU1q5/LT+xlTP+4jeARAAAAAAAAAPBUReVmlVXaslFHOTl4xL5sTV4JwSNo/wgeARqQX1JTtiYs0EmZR4JrdjTZRexo2oOFGw/JbLFl+7hkTA+XZh2xZzKZdMmYnlp891RNH9bF+P+v8Wma9uIyfbb+IFlI0KH8uO2IMX3OiK7N7mds30hFVQX6Ld2druLyykbmAAAAAAAAAAC4Q1ZV1hFJigr2d2rftcvWcEM42j+CR4AGFNQqW+OkzCN2O5ocdjRtntVq1afra0rWXDqmZ6uPITY0QG9eM1pvXHWCokNsP4wKSit178KtuvHDjcomww06AKvVqh+224JHvL1MOn1o8zMAeXuZdEZVQFZphUXLEjKcMkYAAAAAAAAAgHNlFtZcA3F25pFO9mVryDyCDsA5qRSAdiq/1C7zSIBzPi72UY9c1G/71iRna19WsSRpUv8o9Y4KdttYzhrRVRPiovSv7+L15aZDkqRf4tP058HleumyUZrUP9ptYwNcbcfhfB3MtpWsmRgXVatEWHOcNbyLFqyzBYb9sD1VZ7UgkwkAAEB7sXnzZq1bt05paWkKCgpSr169NGnSJHXv3t2h+SsqKvTbb78pPj5eeXl5io2N1cSJEzVq1CjXDhwAAABAu5Vpl3mk+gZbZwkN8JXJJFmtUm4xwSNo/wgeARpgn3kk1EmZR0IDfOTtZZLZYiXzSDtgn3XkshN7uXEkNhFBfnrx0lE6a3hX3fvFFuUUVyi9oExXv7tWD541RLMm95XJZHL3MAGn+8GuZM1Zw1se6DEhLkrhgb7KK6nQbzvTVFphVoCvd4v7BQAAaIu+/PJL3XvvvUpKSjrmOZPJpJNOOkmfffaZunTpUsfcNp9++qluu+02paenH/Pc2LFjNXfuXA0bNsyp4wYAAADQ/mXZZR6JbOFNhUfz9jIpLMB2njiPzCPoAAgeARqQX2KXeSTQOR8XLy+TOgX5KrOwnMwjbVxecYV+2J4qSYoI8tUZLSiT4WynD+2sn++Yors/36IVezJltUpP/bBTCWkFeuqC4fL34SI42g+r1WoEj3iZpDOGtfyz6OvtpdOHdtYXG1NUVG7Wij2ZLSqFAwAA0BZZrVbdfvvtevXVVyVJnTp10vTp0xUXFycvLy/t379fS5cu1YoVK5SZmVlv8Mgbb7yhm2++WZIUGRmpSy65RF26dNH27dv19ddfa926dZo0aZJWrFihESNGtNrrAwAAAND25ZbUXGvrFOTc4BHJdv0nr6RCudwQjg6A4BGgAa7IPCLZdl4Ej7R9S3alqbzSIkk6f1R3j8tKEBsWoHnXjdUrS/bolSV7JElfbEzR/qwizf3riU59TwPutCu1wCgfNa5vlNNSE541vIu+2JgiSfpx+xGCRwAAQIfz2GOPGYEj1113nV5++WWFhYXVamO1WrVq1Sp17Vp39rf4+Hj93//9nyRp1KhR+uWXXxQTE2M8v2rVKp1xxhnKy8vTZZddpm3btsnb27OOrQAAAAB4LvuMIM66EdxeRKCv9lctx2KxysuL7O5ov7zcPQDAk+XbBY+EOTN4pCptVnG5WaUVZqf1i9a1ZGdNuuWzhtefntmdvLxMuvP0gXrtyuMV4Gv7yl+/L0fXzl1X6/0NtGX2JWvOHuG8z+JJA6IV4m872FgcXxMsBgAA0BFs3rxZTz/9tCTp4osv1ty5c48JHJFqytZERUXV2c8///lPmc1mmUwmffTRR7UCRyRp0qRJevzxxyVJO3fu1IcffujkVwIAAACgPbOvIhAe6PybZsOrsplYrFJBaWUjrYG2jeARoAH2O4HQAOdFK0bapc3KIc1Vm1ReadGy3RmSbD9GRvfu5OYRNezckd302Y0T1CnI9sNp84FcXfPuOmr0oV34NT5NkmQySWc6MZDL38dbpw2JlSTll1Zq3d5sp/UNAADg6Z577jlVVlbKx8dHr7zySrP6yM/P13fffSdJmjZtmoYOHVpnu7/97W8KCAiQJH388cfNGzAAAACADinf7jqHK4JHIuz6tC+RA7RHBI8ADSgqr8kKEuzvvOCR6swjkihd00at3ZulwjJbcNGpg2Pl4+35X6cje0To49njFVn1/ttyMFcz564j+w3atLT8Uu1KLZBke4/HhgY4tf/ThtSUqlm+J8OpfQMAAHiq/Px8ffnll5Kk6dOnq1u3bs3qZ9myZSorK5MknXHGGfW2CwsL0/jx4yVJS5cuVXk5x8kAAAAAHFO7bI0LgkeC7IJHirkhF+2b51/tBNyouKwm80iQn/NqLkcG1+xocorY0bRF9iVrqjMTtAVDuoZpwezxiqoKIPnzYK7u+XyLrFarm0cGNE91BiBJmjowpoGWzTO5f7RMVSUsl+8meAQAAHQMa9asUUWF7Vj15JNPliRlZ2dr/vz5euKJJ/TUU0/pww8/VEpKSoP9bNu2zZgeMWJEg21HjhwpSaqoqFBCQkILRg8AAACgI8kvtR27eJmkED/n3QherXbmEa7poX1z/icIaEeqM4/4+XjJ14mZJTrZla3JpmxNm2O1WrV4p61Mho+XSVNccMHalQZ1CdWHN4zTxW+uVnG5Wd9tPaL+sSG6Y9pAdw8NaDJXB490CvbTyO7h2pKSp12pBUrPL1VsmHOzmwAAAHiaLVu2GNODBw/Wo48+qmefffaYjCBeXl669NJL9dprrykqKuqYfvbt22dM9+rVq8Fl2j+/d+/eRoNN7DUWxHLkyBGH+wIAAADQtlRnHgkL9JWXl8np/YfbXdPL5Zoe2jmCR4AGFJfbMo8EOzHriCSjbIgk5VC2ps3ZnVaolJwSSdL4flEKC3B+GjRXG9otTP+9/HjN/nCDrFbp5cV7FBcTovOOa146asAdzBarVu7JlCSFBfjouB7hLlnOlIEx2pKSJ0lavidTF4/u4ZLlAAAAeIqsrCxj+umnn9bq1asVHBysSy+9VAMGDFBOTo5++OEH7d69W5988ok2bNigNWvWHBNAkp+fb0yHhoY2uEz75wsKCpo03p49ezapPQAAAID2wwgecdG1GvvMI3lkHkE7R9kaoAFFZbbMI0FOTnPVyS54JJvgkTanOuuI1LZK1hxt2tDOeuCswcbj+xdu1f6sIjeOCGiaLSm5xo/1yQNi5OPEDFH2Jg+oyWiyYg+lawAAQPtXWFhoTK9evVqDBw/Wzp079eGHH+qf//ynXnrpJcXHx+u2226TJCUmJurWW289pp+SkhJj2s/P75jn7QUE1GR3s58PAAAAAOpjtVqVX3WOODzQRcEjQXZla4oJHkH7RvAI0AAj84i/kzOP2KW4ymnjKa6sVqsKSjvWztI+eGTakM5uHEnLzZ7cTxee0F2SrUzTnZ/+qUqzxc2jAhyzLMG1JWuqHd8rQiH+tiDCFXsyZbFYXbYsAAAATxAYGFjr8YcffnhMdg9vb2+99NJLOu644yRJn3322THlY4KCgozpo0veHK20tLTO+Rxx8ODBBv/WrVvXpP4AAAAAtA2FZZWqPl1L8AjQcpStAephsVhVUuGazCOR7STzSFZhmW6Yt0HbD+Xpukl9dP9ZQ+TtgnpyniSrsEx/HsyVJA3qHKqekU07qelpTCaTnpgxXBv352h/VrE2HcjV60uTdNtpA9w9NKBRy+2ygEweGO2y5fh6e2liXJR+iU9TdlG5dhzO1wgXlciBe5ktVv28I1Xf/HlYlRarwgJ9FBHop9OHdtaEuKjGOwAAoJ0ID6/5rTN06FCNGTOmznZeXl669tprdffdd8tisWj58uW68sorjefDwsKMafsSNnVpSombo/XoQVlBAAAAoCOyLyPjquCR8MCaa3q5JW33mh7gCIJHgHqUVpplrYpWdHbmEfuyNW0180hecYWueXed4o/YTvC9s2Kv9mUV65XLRzk92MaTrNubbbwvpg5yXaaD1hTs76MXLx2lS95cLYtVemXJHk0ZGKNRPSPcPTSgXjlF5dpiF8jVNTyw4RlaaMrAGP0Sb8s6tHxPBsEj7YzZYtUn6w/o7eXJ2p9VfMzzc1ft1amDY/Xg2YPVP7ZpF7MAAGiL4uLijOmBAwc22Nb++aMzj/Tr18+Y3r9/v4YOHVpvPwcOHKhz+QAAAABQn/ySSmM6LNA116bsM4/kkXkE7Rxla4B6FJWZjWlnB0ME+3nLz9v28csuans7msKySs18ryZwpNqv8Wm67K01ymnD2VQasyY5y5ie0K/93IU+uncn3XqqLduI2WLVPz7fogrK18CDrUzMNNIRtkYg15QBNctYvjujgZZoa8orLbr14016aNH2OgNHqv22K11nvrxC/12yR1YrpYsAAO3byJEjjenG9nv2z3t51T7NNGLECGN6y5YtDfazefNmSZKfn58GDCATIgAAAIDG2WceCXNZ5hG7sjUlbe+aHtAUBI8A9Sgur4lWDPJzbuYRk8mkTsG2nU1bDLS445PNRumWqGA/PXPhCIX62wJsth3K0/O/JLhxdK61dm+2JMnLJI3p08nNo3Gu/zu1v0ZWZVPYk16o91btdfOIgPrZB3BMHej64JFeUUHqE2UrU7Vxf44KyyobmQNtQVmlWTd/tEk/bk81/ndS/2h9cP1YrX9ompbcPVX/vnikuoQFSLIF17346249/3MCASQAgHZt2LBh6tOnjyRp586dDbaNj483pqvnqTZ16lQFBtoyxP3888/19pGdna1169ZJkqZNmyZfX9ec9AWAjiCvpEI7DudxzAIA6BBao2yNr7eXQqqugeW20WoCgKMIHgHq4crMI5LUKchWuia7uLxNHcztzSzS4p3pkmw74vmzxumKsb30xd8nKrgqyOabPw/XCr5pL7KLyrUrtUCSNLx7uEID2tcJTV9vLz11/giZTLbHLy/eoyN5Je4dFJosPb9Ury7Zo3s+36KZc9fpkjdX6/WliSqtMDc+cxthtVq1OsmWBcjfx0uje7dOINfkquwjlRar1u/LbpVlwnXKKs266cONWrzTVo7I38dL7113oubPGqcpA2MUE+qvuJgQXTqmp36/52Tddmp/Y97Xlybp3wSQAADauZkzZ0qSdu/erZUrV9bZprKyUvPmzZNkyxhyyimn1Ho+ODhYF1xwgSRp6dKl2rRpU539/O9//1N5ue0k7NVXX+2U8QNAR1RaYdZfXlupc/67Uu+u5KYgAED7l2+fecSF12yqA1PyyDyCdo7gEaAe9sEPwU7OPCJJkcG24JHySouKy9vORd0fth0xpm8+OU5DuoZJkgZ1CdW5I7tJspW1+X7rkTrnb8vW7a25WDyub6QbR+I6I3qE66pxvSRJxeVmPfl9w3cZwrOs2JOhs15ZoRd+3a0vNqZo2e4Mrd+Xo3//lKAzXlquxfFp7eJi98HsEh3KtQU2jenTSQG+zv+OrsuEuJpSVfYlrNA2PfPDLv2eYMtgE+Drpbl/PVGnDIqts22gn7fuOmOQnpgxzPjfG0uT9Opvia0yVgAA3OGee+5R165dJUnXXHONEhJqZ5gsKyvT7NmzjcwkN998s6Kiji3t+fjjj8vPz3b8e+WVV+rgwYO1nv/555/11FNPSZJGjRqlyy67zOmvBQA6it93pRvlOL/f1v7OzQHO8syPOzXmycUa8+SvGv/0Ek169jdNff53TXtxmV77bY+7hwegCfJLXZ95RJIigmx95xZXtItz7EB9CB4B6lFkF9AR5O+CzCNVwSOSLaNFW/GdXVDIOSO71nru0hN7GtOfbah9QrA9sL9YPL7fsSdF24t7zhhkBDd9v/WIVu7JdPOI0BizxaoXf0nQtXPXKaue75MD2cWa9cEGPfrNjjb/4/aP5Jr35MS46FZbrn3Q2JokgkfaslWJmXp/9T5Jtowj7183VpP6N/5eumZCHz1x/nDj8UuLd2tVIt+RAID2KSQkRIsWLVJwcLD27dunkSNH6i9/+Yvuvvtu3XDDDYqLi9P7778vSTr55JP17LPP1tlP//799e6778pkMikhIUGDBw/W5ZdfrjvuuEPTpk3TWWedpbKyMsXExOizzz6TlxenqgCgub7detiY3nkkX5VmixtHA3imQ7klemtZsjILy5RZWK7U/FIdyi3R/qxiJaYX6j+/7NbB7GJ3DxOAg1qjbI1UEzxSabHWun4ItDcckQP1KC5zceaRoJrgkZw2UiMtOaNQO4/kS5KO6xmhHp2Caj1/Qq8IDYgNkSSt35ejpIzCVh+jK62tyjziZZLG9GmfmUckKSLIT/efNdh4/OT38TJb2nawQXv3xHfx+u9viaqOCTl5UIx+uG2yNj9yun66Y7LG96t5v37wx359tPaAm0bqHKvtAjfss4G4WlSIvwZ1DpUkbTuUp4JSUhS2RfmlFfrH51uMx/dOH9ykgMBrxvfWP84cJEmyWqU7Pv1TGQVlTh8nAACeYNy4cVq3bp2mTJmi8vJyffvtt3rxxRc1d+5cHTp0SKGhoXr44Yf1yy+/yN/fv95+rr76av3www/q16+fiouL9emnn+qVV17RkiVLZLVadcYZZ2jt2rUaMGBAK746AGhfCssq9duudONxaYVFSRlFbhwR4Jl2V5Ull6SwAB91DQ9QTKi/guyuASTYtQHg2eyDR8JcGjxid02vDd0QDjSV89MpAO0EmUeOZV+y5twRXY953mQy6bITexqlTj7bcFAPnDWk1cbnSrnF5dqVagucGdotzKURrJ7g4hN66KO1B7TlYK52pRbo6z8P6cITerh7WKjDT9uPGBkUvL1MuvuMgbppSpy8vEySbN81C2aP1/w1+/XI1zskSY9/u0NDuoZqdO+2FwRltVqN4JFgP2+N6B7eqssf3y9SCWkFslil9fuydergzq26fLTcv76N1+G8Ukm27XndxD5N7uPvU+O0dm+2lu/OUEZBme767E/Nu26s8bkDAKA9GTp0qJYtW6akpCStWbNG6enpCggIUP/+/TVp0iQFBQU13omk6dOnKzExUWvXrlV8fLzy8vIUGxuriRMnqm/fvi5+FQDQ/i3ZmabSitqZRrYdytOgLqFuGhHgmexvePznecN08WjbOc9Fm1N056e2m02SMwslcc4HaAvyWyvziF3feSUV6tlAW6AtI/MIUI/icldnHqnZ0bSVzCP2JWvOGtGlzjYXHN9dvt62i2cLN6aoop2kx1y3N9vI6jC+b/stWVPNy8uk+6YPMh6/8MtulVWSis3THMwu1j++2Go8fvwvw3Tzyf2PuYBtMpl0zYQ+un6S7aR8hdmqm+ZvUlp+aauO1xmSMoqMLA9j+0bK17t1f8rYZzpZk5zdqstGy63Yk6EvNqZIkkL8ffT8xcc1K+DDy8ukFy89TjGh/lX9ZuqdFclOHSsAAJ4mLi5OV111le688079/e9/1+mnn+5w4Eg1k8mk8ePH6/rrr9edd96pq666isARAHCSb7ccPuZ/2w/luWEkgGdLTK8JHomLCbabDjGmk9LJ2gO0Fa1dtkaScovJSI32i+ARoB5FZXaZR/xcnXnE83c0SRmF2lWVrm9UHSVrqkWF+GvaEFtUdmZhea10mW2Z/UXicU0ob9CWTYyL1pSBMZJstUA/WtO2S520N+WVFt368SYVlNoC3c4d2VVXjevV4DwPnD3YKGGTUVCm+xdubbC9J/ojKdOYnhgX3erLH2sXPPaHXfkceD6LxapnfthlPH7k3CHqGdm0C172okP89cplo2Sqij15aTE1kQEAAAC4R15xhZbtzpAkRdqdc9xG8AhwDPvMI3GxNQEj/eyDR9pZOXagPbMPHgkNcF3BjYjAmv1rbknbuCEcaA6CR4B61Mo84u+CzCPBbas+2g92WUfOHXlsyRp7l4ypKW/yezsJHlm713aR2GSSxvZpe6U+muveM2uyj7z2e6IKyyobaI3W9MbSJG1JsZ0E6hMVpGcuHCGTqeEMCr7eXvrflSeoc5gtW8LvCRltLgBitd147bOAtJbIYD8Nrkr5u+NwXq2DE3i2b7ceVvwRW/mx4d3DdMnolieXnNg/Wn+tKntTWmHRI19vl7U6TRUAAAAAtJKf41NVYbYdi1xwfHf16BQoSYo/nC+zhWMUwF515pHYUH+FBdRkEgjx91GXsABJBI8AbUl+1c2VwX7eLs1SHU7mEXQQBI8A9XB55pEgu8wjbaBszY/bU43ps0Y0HDwyoV+0UbpmTXLbujBdl4LSCuOC45AuYbV+JLR3w7uH67zjukmSsovKNYeyDB4hvaBUby1PkiT5eJn02pUnKDTAsfdlVIi//nHmYOPxsz/ubDMXuy0Wq/GdEh7oqyFdw9wyjvFV2YcsVmnDPkrXtAXllRa98Mtu4/F90wc3q1xNXe4+Y5BxcmlpQkat/SUAAAAAtAb7kjXnHddNI7qHS5JKKsxK5iI4YMguKldO1UXf/nZZR6r1qypjk1Ncoew2cMMngJrMI64sWSNJEXb9c0Mh2jOCR4B6tGbmkexCz/4hWlhWqZ2ptuCJoV3D1D0isMH2gX7eGtUzQpK0L6tYR/JKXD1El9qakqfqa+uje3dy72Dc4J4zBsqn6iLr3JV7VVDKDyN3e3nxHhWX2wLcrhzXS8OrTgo56oLjuxvZM7ak5LWZi927UguMA/xxfSPl7aSL/01ln/GkrWVu6ag+XX9AB6pKykzqH6XJA2Kc1neIv48e+8tQ4/Hj3+7gexIAAABAq8ksLDOydPaMDNRxPcJrnSegdA1QozrriCTFxRwbPGL/PwKvgLahOpAjzNXBI3Y3hOe2gRvCgeYieASoR1F5TeaRYBdkHqkVPOLhO5rth2qCJ0b1inBongn9ai6urk1u23fm/3kw15g+3sHX3570jgrWBcd3l2RLAffBH/vdPKKOLTG9QJ+uPyjJdtH6ttMGNLkPby+T7ptek33k+Z8TVGG2OG2MrrI6KdOYnuiGkjXVxvWNVHWFoDV7CR7xdMXllXplSaLx+F67zDvOcuawLjptcKwkKS2/TC/9usfpywAAAACAuvy4PdUoTXPuyG4ymUxG5hGJ4BHAnn05mroyj8RVZR45ui0Az1RaYVZ5pe28tuuDRyhbg46B4BGgHiV2mUeC/JyfeSTA19voN8fDU+BtsQueGNUjwqF5xvdrP3fmbz6Qa0xXZ1TpaG45pb+qkzzMWZGsorLKhmeAyzz7Y4JxUuimqf0UHeLfrH5OHhSjcX0jJUl7M4uMgBRPZl8Ga2L/aLeNIyLIT4O72Erm7DicrzwOFjzaJ+sOKrOwTJJ09oguOs4F3+Mmk0mPzximAF/bT+sP/tjHHUoAAAAAWsV39iVrRtpKD9tnHtlO8AhgaCzzSL9amUeKWmVMAJov3658TGuWrcmlbA3aMYJHgHoUldllHvF3fuYRSepUleYqx8Mzj2xNqTnIHNnTsfIYx/fqJD9v21dMW74z32q16s+DOZJsPz76Rgc3Mkf71Cc6WDNG2bKP5BRXaP4aso+4w/p92Vq8M02S1DnMXzec1K/ZfZlMJj1w9hDj8TsrkmWpCkrxRJVmi5HFKDrETwPquDukNVVnV7JapXX72nZ2pfaswmzRuyv3Go/vmDbQZcvq0SlIf5sSJ0mqtFj19A+7XLYsAAAAAJCk1LxS45i0X0ywhnS1laiNDPYzyk7vOJzv0cf7QGtqNPOI3f/IPAJ4vrxWDB6xz2zCzYRozwgeAepRXJV5xMsk+fu45qNSXbomp7jCow/itqTkSpICfb3Vv46I7LoE+nkbWTr2ZxXrcG6Ji0bnWik5JcostAX3HNczQqbqWhUd0C2n9DdKdbyzIlkldqWd0Dr+93tN6Y27Th+owBZmRRrVM0InVWXw2J9VrKW701vUnyttP5yvgqqMN+P7Rbn9szi+X6Qx3dazK7VnP2w7okNV+59TBsVoYOdQly7vpqn91DnMlg1o8c40rU7MbGQOAAAAAGi+77cdMUpNn1dVsqba8O62jJnF5WYlZ5JBAZBqMo+E+PsYx+/2uoYFKNDXdr4ticwjgMezDx4JC3Bt8EiAr7fx/ZBb4tk3hAMtQfAIUI+iqgvjwX4+LrtI2akqeMRssaqg1DPLgGQVliklx3bhbXj3MPl4O/61YX9xdW0bzT7yp33Jng5asqZa/9gQnTOiqyQps7BcH6874OYRdSw7j+RraUKGJKl7RKAuOqGHU/qdObGPMf3+as/NKGMfoDExzn0la6qN6xtlBFPZl9OB57BarXprWbLxuDoriCsF+fnoH2cONh7/67t4o8wUAAAAADjbt/Yla47rWuu5EZSuAWopKTcbN5jExQTXec7fy8ukfjG2zNMHsotVXmlp1TECaJr80tbLPCJJEUG2ZeSSeQTtGMEjQD2Kq+5wD/Jv2Z39DYkMqtmZZXto6Rr7kjXH9Yho0rzj46KM6TVJbbOsg33wyPEdPHhEkm49tb8x/e6KZFWYOYBqLe8sr7kIPnty3yYFcjXk1MGx6hlpS2W7fHdGrdqvnmR1Uk0Ghwl23y3uEh7kq6FdbXdx7UzNV66Hfod3ZKsSsxR/JF+SNLJHeK2ARle68PjuxknaXakF+nzDwVZZLgAAAICO5WB2sXHeakjXMPWPrZ1pcbhd8Mg2gkcAJWcWGpl64hooh9yvKvO22WLVgWyyjwCerHbZGh+XL686QCW3pEJWKzeMoX0ieASoR3XmkSA/1+1wqjOPSFJ2kWdeeKwuWSNJI5sYPHFCr07yq7rAvaaNZh7ZfCDHmO7omUckaXCXMJ06OFaSdDivtNYdLnCdQ7kl+qZqXUcE+erSE3s6rW9vL5NmTuhjPP7gj31O69tZyist2rDP9lnsGh6gPlFBbh6Rzfh+tiAWq1Vau7dtBsi1Z28tTzKm/zalX6uVOvLyMumRc4caj//zy24VlHI3AgAAAADn+nH7EWP63JFdj3me4BGgNvsyNHENlGaPq8o8IkmJ6QSPAJ4szy4DSFgrZh4pr7SotIIba9E+ETwC1KO4vCrziJ8rM4/UBI/keGjwSO3MI+ENtDxWgK+3RvWKkCTtzyrW4aq0gG1FeaVF2w/b7lrvExVUK9inI7tpak3ph7eWJRNh2wrmrtyryqrSF9dO6OP0oLZLxvQ06jV+sTGlVro/T7AlJVclFbaAvglxUa0WBNCYCf1qMqDYl9WB+yWkFmjFHlu2mp6RgZo+rEurLn9s30idPcK2zMzCMr2+NKmROYC2z2KxqrTCrLySCmUUlCm/tEIWyjYBAAC4TEJqTebQkwfFHPN8dIi/uoYHSJLiD+fz2wwdnn223f4NZB6xDyxJyvDMDL0AbPJLK43pVilbE1hzjSi3xDOv6QEt5focPkAbVF5pUYXZdkAV3FqZRzyw5IHVatXWqswjEUG+6hXZ9Lv9x/eL0rqqO/LX7c3W+cd3d+YQXWpXar5R15KsIzVO7NNJJ/SK0KYDuUpIK9DShAydUpWNBM6XV1yhBesOSJL8fbw0c0Jvpy8jPNBXF43urvlrDqi43KwvNqTo+pP6On05zbU6sSYwwz5gw91O7BspL5NksUprkgke8STz7DLoXD/JeWWemuL+6UO0OD5d5WaL3l25V1eO7aWezdiPAp6m0mxRQlqBthzM09aUXO3NLNLhvBKl5pUav5+rmUxSqL+PukUEqndUkPpEBWtotzCN6hmhXpFBHhMMCAAA0BalF5Qa093CA+tsM7x7uI7klaqwrFL7soqMchxAR2QfCNJw5pGa55IzyDwCeLLaZWtaL/OIJOUWV6hrPftfoC0jeASoQ3XWEUkK8ndh5pFgz848cii3RJmFtnGN7BHRrBP8Y3p3Mqa3pOS2qeCR6rqxEsEj9kwmk26cGqcbP9woSXpjWRLBIy70yXpbQIckXTqmp6JC/F2ynJkT+mj+GluQymcbDuq6SX085qLe6qRMY3pCnOcEj4QH+mpYt3BtO5SnXakFyikqJ0ORB8grqdCiTYckScF+3rp4dA+3jKNXVJCuO6mP3lqWrPJKi579aZf+d+UJbhkL0FL5pRVampChX+PTtDQhXQV2d/Y0xGq13QWUn1qgXakFtZ6LDPbTxLgoTR0Yo6kDYxQbFuCKoQMAALRbGQVlkiQ/b69aF7Psjegerl/j0yTZStcQPIKOLKkq84iPl0m9GyiJ3De6pmwNmUcAz2YfPNIaZWvC7fa3OR54QzjgDASPAHUoqrpQK7k480iQZ2ceaUnJmmoj7Oqrbm9j9VU3H8g1pkf16lR/ww7o9CGdFRcTrKSMIq3bm61NB3J0AuvI6cwWqz5cs994fN2kPi5b1oDOoUZGmV2pBdpxOL9WfWR3Ka0wG5/F3lFB6tHJszI3jO8XadSOXrs3S9OHH1tnGq1r4cYUo8zRhSf0UGiA6w8c63PrKf31xYYUZRWV6/utR3TdxGyN6RPptvEATWG1WrXpQI4+XntQ3209rLLK+mv5hgf6qltEoMIDfeTn4y0/b5NKKywqKK1QbkmFDueWHJOVJLuoXN9tPaLvth6RJI3u3Unnjuyqs0d0VWcCSQAAABpVHTwSE+pf780fR5+XmzGq7dzUBTiT2WJVcqYti0jvqCD5NpChNNDPW90jAnUot0RJGYWyWq0ec4MVgNryWzvziF3Zmrxizyr9DjgLwSNAHYrL7DKP+HXczCNbqkrWSNJxPSKa1UenYD/16BSolJwS7TicL7PFKm+vtvFjuzrziJ+Pl4Z2DXPvYDyMl5dJN06J070Lt0qS3lyapLevHePmUbU/v+9KV0pOiSRp6sAYl98hdPHontpUFajxxcYUjwge2bg/R+Vm2wVLTypZU218vyi9s2KvJGlNcjbBI25msVg13y7g6loXlHlqitAAX911xkA9tGi7JOmJ7+K16OZJ8moj+0F0TBaLVT/tSNVrvyUq/kj+Mc+HBfho8oAYHd8rQqN6RmhQl9BGg7TMFqsO55YoMaNQWw7m6s+Dudq4P6dWBpON+3O0cX+OnvguXqcMitXV43trysCYNvO7EQAAoDVVmC3KqjqXGB1af4ZS++P6bW3spi7AmVJyio3y5P1jGz+/FhcbokO5JSoorVRGYZliQwlwBzyRW8vWlBA8gvaJ4BGgDrUyj/i7MPNIcM2OJrvI83Y02+wyj4zs2fyLyCO6hyslp0TF5WYlZxRqQOdQZwzPpfJLK7S3Khp9SNcw+fnUH43eUc04vpte+DVBafll+nVnmhLTCx06+ILj5v2xz5ieOdH1F8HPPa6rHv92h8oqLfrqz0N64OzB8vdxXQCdIzy1ZE21E/tGysskWazSH0lZ7h5Oh7cyMdO4k2hCvyiP2N9cNqanPli9XwlpBdqSkqevtxzSBce7p5QO0BCr1arvtx3Ry4v3KDG9dmrmsAAfzRjVXWcN76IT+0Y2eJdeXby9TOoZGaSekUE6ZZCt1F2l2aI/D+Zq2e4M/bIjTQlptrI2Fqu0ZFe6luxKV49OgbpyXC9dOqanol1Utg0AAKAtyiwsM6ZjGwgeiQn1V5ewAKXml2rHoXxZLFaC2dEh2ZefiXPg5qy4mGAt350hSUrOKCJ4BPBQ1cEjft5e8m+FazgRdgEquWQeQTvF1VCgDq2VecS+bI0n1kfbXXUSPzrEv0U/kNviXQ47D9fcaTu8G1lH6uLv463rJ/WVJFmt0jvLk908ovYlMb1QK/bYAid6RQZp6sBYly8zLMBX04d3kWT78fvbznSXL7MxK/fUBI9MjIt240jqFhbga3zHJaQVKMvuBB5a3wetHHDlCB9vLz187hDj8XM/Jqi4vLKBOYDWt+lAji58Y7Vu/XhzrcCRkT3C9cIlx2ntg9P0xPnDNbF/dJMDR+rj4+2lMX0idfcZg/TznVP0y51TdNup/dU1vOY3Z0pOif79U4ImPLNEt3+yuVZgMwAAQEeWnu9Y8IgkDe9uO69VUFapA9nFLh0X4Knsj3McufnNPvuvfeAJAM9SXbYmLNC3VcpLRdhd08st8bxreoAzEDwC1KG1Mo/4enspNMDWv6eVrcktLldmoW1M/WODW9TXiDYYPLLDLnhkWDf3l+7wVFeO62W8hxdtPqS0/FI3j6j9sC+9cc343q2Wtv/i0TUZET7fmNIqy6xPXnGFtlZ9ZwzuEqqYRk6IuYt9OZ21e7PdOJKO7WB2sZbssgU8dQ0P0LQhnd08ohqTB8To1MG2ALDU/FK93UaD7SwWqw7llmjFngx9vuGgPlyzX3NWJGvOimR9su6Afth2RGuTs5SWXyqr1eru4cIBWYVluuuzP3Xh66u1uapsmSSN6d1J864fq69vmaSLRvdQoAuDqasN7Byqu84YpBX3nqK3rxmtKQNjjOcqzFZ9/edhnffaSl01Z42W7c7gPQYAADq0jAL74JGGb/hqizd1Ac6WlF5kTDuaeaSueQF4lvyqcrjhga1TaMO+bE0emUfQTlG2BqiD/R3Brsw8IkmRwX4qKK1UtodlHrGPqG5pKRL74JHtbeQgtXbwCJlH6hMa4Kurx/fWG0uTVG62aO6qvXrgrCGNz4gGFZZV6ouqwI0AXy9dMqb1SlxMjItWt/AAHc4r1bLdGUrPL1VsmHtSc/6RnKnqa4Mn9fe8rCPVxveL0ltVwQBrkrN09oiubh5Rx/TR2gPG++XKsb3k46TsCM7y4NlDtHx3hiotVr21LFmXjumpbhGB7h5Wg6xWqxLSCrQsIUPLdmdo04EclVZYHJo3yM9bfaKC1Tc6WH2ig9QvOkT9Y0MUFxuiEBcG5sIxVqtVCzcd0lPfxyvH7mRH/9gQPXT2EJ08KKZV7tipi4+3l84Y1kVnDOui/VlF+njtAX224aAxzlWJWVqVmKUhXcP0tyl9de7Ibk7LhuIJ8ksrtONQvnYcztP+rGKl5pcqLb9UxeVmWaxWWa1SiL+PokP8FBPqr77RIRraLUzDuoVR2gcAgA4k3T54JKzh3wBHn5c777huLhsX4KkS7cvWOHCuu79dgElyJplHAE9UabaosKw6eMS3kdbOYR88QtkatFecuQXqUGyfecTPtR+TTkF+2p9VrLySClWaLR5zsaup0dgN6RTspx6dApWSU6Idh/NltlhbLYtCc+04bAty8fYyaVCXUDePxrNdN7GP3l2xV+Vmiz5ec0C3nNJfYQGt82OtvVq0KcX44Xv+qO610uG5mreXSRee0EOv/Z4os8Wqr/48pL9NiWu15dtbYVeyZtIAzw0eGdOnk7y9TDJbrPojKcvdw2m2SrMtKMBT9kNNUVph1qfrD0iSfL1NunxsLzeP6Fj9Y0N09fjeen/1PpVUmPXPr3fonWtHu+0CfUMKyyq1aPMhzf9jvxKqStg1VXG5WfFH8hV/JP+Y57qGB6h/rC2YpHdkkLpFBKpbRKAig/3UKchPAb5e9a6XSrNFZZUWlVaYVVxu+ysqr1RJuVlFZZUqN1uMICI/Hy+F+vsoJMBHMaH+6hwaQH13SUfySnTvF1trfceGBfjonjMH6YqxvTwqEKN3VLAeOHuI7jx9oL7YmKI5K5K1L8uWan3nkXzd+ekWPf9Tgm6Y3E+Xn9jTpRkDXaW4vFJrkrO0Yk+mVu7J1J705p+Y7hcdrCkDYzRlYLQmxkUrwNf1GWMAAIB7pBfUZH6NaSSAtFbwyOG2cVMX4ExWq9UoW9M1PMChGxpiQv0V4u+jwrJKytYAHqo664hkK1vTGiICKVuD9q/tnV3r4KxWqxYsWKAFCxYoPj5eeXl5io2N1cSJEzV79myNGzfO3UNsF4rK7DKP+Ls+84gkWa1SXkmFojzkjkFnZh6RbAeqKTklKi43a29mofrHem5ARmmF2Thx3z8mhBPvjYgNC9BFo7trwbqDKiir1EdrDujvJ7sn2KA9sFqtmvdHTcmaayf0afUxXDTaFjwiSV9ucl/wyKpE24VNX2+TxvWNdMsYHBEa4Kvh3cO15WCu9qQXKrOwrM3c/Z1eUKqfd6Rpyc40rU7Mkslk+74+oXcnnTmsi0b37uTuITrk+61HjKwEZw3v6rElju48faC+33ZEGQVlWrwzTT9uT/WoTDX5pRV6a1mS5q3ebwSw2eseEaghXUPVLyZEPToFKsjPR/4+tkCDwrJK5ZdU6EheqfZlFWlfZpEO5pTIbDm2tMiRvFIdySutFbxgz8/bS/4+XvLz8ZKXl0kVZovKKiwqN1vq7M9Rft5e6t4pUAM7h2hUz04a1TNCx/eK6DD7eavVqkWbD+nRb3aowO4Ey3nHddMj5w5pNN25OwX4euvq8b11xdhe+mVHqt5cnqwtB3MlSYfzSvXEd/F6ZfFuXTOht2ZO7OPRr0WyfV6W7EzTj9tStXR3eqMZfbxMUpCfj7xMkslkUkFpher6KCRnFik5s0jvr96nEH8fnTmsi/4yqptO6h/t8YHbAACgaZqSeSQ2LECxof5KLyjT9kP5slqtHhnEDrhKVlG58kps5wwcvUnSZDIpLiZYW1LylJJTotIKc4c5dgTaivySmswfrZV5JMDXdr6qvNJC5hG0WwSPtCG5ubmaMWOGli9fXuv/WVlZ2rlzp+bOnav77rtPzzzzjMvHUlBQoPz8Y+8klaSgoCD5+NjeWpWVlSouLm6wr7CwmpIgZWVlKisrq7ett7e3goNr6g2WlJSooqL+L2g/Pz8FBNScPC4sLJTFUv/J2cDAQPn6+qq43CyTrAoyVcrXXFbvaw0JCZGXl+2iSUVFhUpKSurt28vLSyEhNT9OS0tLVV5erig/i4JNttdwKCNbvhbb6/P19VVgYE06+6KiIpnNZtXH399f/v41B4v1jblaY9tp35FMY1xdAmufnW7Odhoa46vlVf1tTDyi2ICaPpu7nSTJYrGosLDh6O+mbqfk3Erj4tTwLoENrkt3b6ejuevzdNUJsfp2Q7KsVmnBqgRdclyUwkOCXbqd6vo81actbaeN+3J0JCNHwSZpVM8I9Q6vfWDqqu89qWY7RflJY7sHasfhfB1My9amxMNGEFlrbaeD2cVKy85XsMmq43tEqLK0WPmltdt70udpfK9g40LmmuQsnTagk8u3U0Mc2U4/70jV0z/sVFmlVcXWmgOsrQcytfNAuj5akaBLxvTQLaf0NwIEJM/8PH2wxhZw5SuzLj0uqt5ltNbvCKnu7WSS9NC0Pnroq+2SpMe+2a5JcdEKD/J16/dehdmqL7ek6fXl+4wgnOrfACN6hOv0IbEaHxetnp1q+nNkO1VarDqSV6qD2UU6WCAlphcqMaNQ+9LzVFpa/+fJYjGpoMxHqmrib6qUj6wKkGwr8ejxy0vl1prvyiBTRV3NJIuUnlWmg5kF+nlHmq2tr5em9gvV5AExmjowRqEBxx4etYf9U15xhR748k8t23FIkhRskmJC/XT/WYM1MS5aspYrP7/cI3+XS7U/T5N6B2vSNSO0+UCuPlq7X6sSbRmfCkqt+t/vSXpn+V5ddHwXXTmmq3pHBtXZtzu2k9li1bp92fpxW6qW70lXWYXtt6a3JC95yyIveZmkkd1CNbJLoAZ1CVWf6GB1DvNXVLB/reCP4JBQ5RSXKzWvVLsOZWvnoWzFH843MvxJkrW8Qj9t3qsfNu9TZHiorhzXS5eO6akQH4vH75+quWM72X8GAADwZOn5dsEjDgTODu8ert92pSuvpEKH80rV3cNLaALOlJTevJsk42JCtCUlT1artDezSEO68lsR8CR5bggeMZlMigj0VXpBWa3lA+0JwSNthMViqRU48ve//10333yzunTpou3bt+uRRx7RypUr9eyzzyoiIkL33XefS8fz4YcfKjw8vM7nrr76anXv3l2SlJaWpvnz5zfYl/1Yt2zZot9//73ett26ddM111xjPP7555+VkJBQb/sxY8botNNOMx7PmzevwROaM2bM0ODBg1VUXqkgU6WujUjQn78k6M962v/97383TjAmJSXp66+/rrfvkJAQ3XLLLcbjVatWacOGDYqWdG2E7X8/flbzWgYNGqTzzz/fePzll1/q8OHD9fZ/yimnaOzYscbjN954o962UuPbqZ+kflXj+vKjhBZvp+KEBON17luRoDdW1LRv7naSbCe0G3utTd1OkSeeZzzuVZmiN974rd727t5OR3Pn5+kau6+Ed9/e5vLtVNfnqT5tbTtVf1ZUIH355cFW+d6Tam+n0ZJGV43j14UJ+rWqfWttp1WJmZoesl9dfEqkfOmNN9Ye097d28leWKcYSZ0l2YJHKpPXtcp2qo+j2+nyEKnQ4qMP8warS1iA/Hy81KMkSccFVJXfSUzQ3MQltebxtM/TWVfdaATunBxTolXfLtCqetq21u8IqeHtVP0Z/yB3kJ79aaeeuXCk27/3VhV3UU6ZrTyUr7dJ14ZVrZdCKXO99N362u1b8nlat25dg5+nPFOI1noPs2UaMVs11itJXZVTb/vKyL7y6zVSQX4+8vP2Uu7G72Qpr/+C9M+FPZVcYdtpmSrL1Cd9qw6mS/PreeO09f3TwbIA3fnpn7IUZuvaiORaz2/5ZZu22D32xN/lUv2fpzhJcRG26Y8LBiuv0kflZovWbtmpiKRf6u27tbaT1WrVjsP5+n7+m8ZzXSVdFly7fUGP8TrpuEGaEBelwux0zZ8/XynJUko9/d93332KDvFXdIi/ig8lKGn37xolaVQd57JTKwO1KDdOz/+coJcX79aVndMVVJJW79g9Zf8kuefz5OrjaAAAnCWj0BY8YjJJ0SGNl7rtYRcInp5P8Ag6lkS7DNtxMcENtKwtzi7QJDmD4BHA09gHb4QFtE7wiCRFBNmCR8g8gvaK4JE24r333jMCRx544AE9/fTTxnMnn3yylixZookTJ2rjxo167LHHdMUVV6hXr17uGm6bV1xW/x1qaP922NV/jQr20yE3jqUts1ibX1oAWJmYqdb7yd9ywf4+8vYyyWyxak1ytsb0c/eIHBfo663v/u8kDesWJpPJpO9+qtCOLVnuHpbDPrAr8zSmdyflJu1z32CaYcG6gzpjaBd5QvEak0k6f1R33XX6QH38zja3jWNI1zA9fc3JxuOvvipQQkL9wSPj+0XptNMGG4//t81bhQ2UnX3k3CHK8IrWun3ZWrOrvsvz7cPHaw/o9fXZslqlzu08w/KXf5+oz7Zm6uM1B6SGq8C4XHpBmV74JUHfbzui5Iwi/b2RCmB/P7m/unfvIklydjX18EBfmQptJTIrzFYdyStRXOPXlwAAgIfLqErNGRXsJx9vr0Zaq1Zp1cyGfiwD7VBSepExHdeEzCP9omsCTexLvAPwDPmlrZ95RJIiAm0H1SUVZkpaoV0yWa1c3WsLhg4dqp07dyoqKkopKSm1UglXW7p0qU455RRJ0r333qvnnnvOqWNISUlRz549JUnx8fHG3aZHaytlNupSnXb5rs/+1KJNKQoyVerTG8erVz0pr52RdvmbPw/rmR93SZLumz5Y5x/fTZJ7ywIkZxTpqjm2u/zPHNZZj/1lmFO204VvrNaR3FIF+nlp8V0nqzr7tqelx77mgy3afCBXkrT+gSnyN9X/NemJ5RuquePzdMvHm7Rpf64k6fnLR+vs42zfGe0hjXlDnLWd3liaZFwInz25r64/qa9by2zc+8VWrdiTKUl65fJRGts3slW2k8Vi1ZinFqukuFhh/l766Y4ptdL1V/O0z9PV8/40vjuW3z1REf71Hzi463vvpcW79dl628Vyby+Tbj+tvy49sZdCQ0ONeau3U3JGkR79ZrsSq06yRAb76u1rx6hPTJjHfJ7ySio07dV1Kqu0KDTARyvumSwvS2W97d1dtsbewk0p+tdPybLKpE5Bvvrm5vEKb+CCrjO/9+KP5Ouxb3boYHbN53dA1wg9edHxGt7dlpHD3Z+n1tpOFZVmrdtzWIt3pumn7anKL6n9/ukaEaDZJw/RxSf2kreXqc3snw7llujRr3dow6EiWWT7LpjQN0JPnDugwbTmnrqdmvK9l19aoQV/JGvBH0nKKKi97v18TJrUP1qnDI7VGcf1UWjVnUnO2E7JGUVasitdS3amak9mmSpUsw8INlXI19ukkwZEa/qwLpoQFy1f75r9mqs/T9llJn287oA+XX9QRcXF8lHNb9sgPy+dNbyrLjyhh/rFBHvc73LK1sBZ7M9nHDx4UD169HDziACg+axWqwY+/KMqzFYN7hKqn+6Y0ug8H689oAcX2QLEn7lwhK4Yy02H6DiunbtOy3dnSJLWPXiaYsMaL/UkSbvTCnTGS7YbemeM6qZXLj/eZWME0HQfrd2vhxbZSkP/+6KRuvTEnq2y3NkfbNCv8baMnk35TgHaCjKPtAE7d+7Uzp07JUkXXXRRnYEjki0DSY8ePZSSkqIvvvjC6cEj9kJDQx06sebj49OkE3BHn8BrTGBgYK0ThI2xP/nYkOIys6wyqcjqq+hOEQpz4Mvf19fXOHHqiICAAAUEBCgmqlhFVtt8BZb615f9yXlHNGW9H72dDu0rMsbUr1v0MX01dzsN6B6jxJxUFZVJmWUm9Y8NrbO9o9tJsp1UbsprbWw7mS1W7TxiuxDTKzJIMeF1j7E+rbmdGuOOz9P1pwzVivdstQ3eWnlAZ43sIZPJ5PTtdLTqz5OjPHE7lVaY9emWTBVZfeXrbdKVkwcprI4LfK763pOO/Tz95cQ4/bTblonnh125mnZcn1rtXbWd4o/kK7uoXJKPJvfrrE4RdZdJO5q7P0/j+0UZwSNbDpfovOO6Odx/a3zvfb/1iN5blybJV37eXnpj5hhNGRhzTPvq7TQqLEyf3hqrq+es1Yb9OSoqlG76NF5f3DRR9u9Ad36eFmxOUlml7aLmJaN7KiKk7mDP+rTm5+lof506RKv2F2vxzjTlFFfori+2a8Hs8Q7dNSg173uv0mzRG0uT9PKSPTJbrJJ8FeDrpbtOH6jrJ/WttWx3f57suXI7+fp4a9KQnpo0pKfuO8+sn3ekau6qfUYppMQcs+5btF1zVu3TvdMHa9qQ2Ca91tbeP1mtVn2+MUX/+jZehWWVkrzk42XSXWcM1I1T4uoMxKuPJ22npnzvhQX46sZTBum6yQP09Z+H9MEf+7XtkG1fVlQhfbczV9/tzJXfN4k6vleEJsRFaVzfKA3tGqbwIMf2ab7+gdqXXqAdh/L1R3KWVidlKi3fPoDDFjhiMklj+0TqL6O66dwR3Rzq3xWfp+BgW5D6HdMG6MdtqfpwzX5t3G/L5lNUJn2wMV0fbEzX2L6RumpcL50xtIsC/WyvwZ2/y4/mSb/3AABwp5ziClWYbcGgjl6wsi9tk1lQf+Ap0B4lpdsCnEMDfBQT6vgxTu+oIHmZJIvVFiwOwLPUKlsT2HqXuyPsspzkllQQPIJ2h+CRNmDNmjXG9EknndRg25NOOkmffPKJkpOTlZmZqejoaFcPr10qKq+56zSogTvHnSEyuObgzXax1P2SatWBdPyEcWOGdw/Xj9tTJUnbD+XXGzziTskZhSqtsF2IHN6dE8hNdfLAGA3uEqpdqQXacjBXfyRlaWJ/vocc8f3WI8Z3wFnDuzZ4Z3hrOXVwrEIDfFRQWqmfdqTqyfJKBfm5/qfDsqq7QSTppAFt5/0zvl+U3liaJEn6IzmrScEjrpaUUah7v9hiPP7neUPrDBw5WoCvt+bMHKNL3vxDe9ILtT+rWLPmrdfnN02Un49jQQ6uYrZYNX9tTcmaayb0duNoms5kMuk/l4zUOf9dqUO5JVq/L0cv/rpb904f3PjMzXAgq1h3fvanccFYko7rEa6XLz9efaObdoG1vQrw9daMUd31l+O6aU1ytt5YlmTcnbYnvVCzP9igMb076f6zBmtMn0g3j/ZY6QWlemDhNi3ZlW78r3dUkF65/HiN6hnhvoG5iZ+Ply4Z01OXjOmp+MP5+mzDQX275bCyqva15WaL1u7N1tq92ZL2SJI6h/mrX3SIokL8FBnspyA/H1msVpktVuWXVCg1v1SpeaXal1VkXLA5msmk/2fvvuPbqu/v8R8tW/KQ94ydvRcJZEOBsDeUXWZL2ZSWQkvpBFpa6JcOoKzyoy0QKJQP0AZawoaEMBIgi8TZ03tq2NaW7u8PSVdvJY6ndO+VdJ6PB4/HTXx1dU18LVvvc88L88cW46zZVThtRqWm3kTKNhpw3txROG/uKGxpcuD5zw/gP+sb4faH2znW7u3C2r1dyM0y4JQZlThrdhUWTyhR5LWfiIiIBq+t2yNvlw9yIbw0Xxxbw/AIZQ6XL4BGe7jtbkJZHnS6IQTqjQaMLs7Bvk4Xdrf3QJKkIT2eiJIrPjyi4Nga4cYQu+vwDaxEqYrvAqWAuro6eXvixIn97it+vK6uDsceO3BtYVRDQ/8z35ubmwd9rFTn8sXqjXOSPK+sKCcWHrFpMTwyhDmQA5leFQtjbG1x4jz0PfpITVuaYvXvM6oH13ZAMTqdDjcdPwE/eGkDAOCh93di8YQS/mI1CM99tk/evnqJNhbBzSYDzppdhRfX1sPlC9+R/825ya/4fn9rq7y9dEp50p8vUeaNKYJRr0MgJOGz3Z1qn47MGwjilhfWoTfy2vbNuaNw+cLBVxQX5mTh2WsW4IInPkWzw4ONDQ788d3t+Onp05J1yoOyckebPHblG5NKUzIAUZiThUe+NReX/PUzBEISHv9oN2qKcnDZEP59BiJJEl75qgH3vL5F/hrQ64Bblk7E90+cBNMgm04yiU6nw+IJJVg8oQRr93bhgRVbsS7SKvTlfhsufPIznDy9Aj85bSomJvDnpJF48+tm/PzfX8MmvGlx4VE1uOecGcjL5q9806utuOecGfjFmdPwxT4bVmxuxofb2+JGNwFAq9N7UIPI4FhMBswfV4ylU8pwxqwqVGgoMHI4M6oLcP/5s/DTM6bita8asOzz/dgduZuy1xfEv9c34t/rG5Fl0GP+uCIsGleCGaOsmFFdgPL87MP+bOfxB1Hf5cLGBgc2Ndixsd6OxRNKcdfpyQnGERERZaJ2oTlk0OGRXDE8oo33H4mUIDaGDOf3t/FledjX6YLLF0SL04OqgsG3LRJRcomjhwsUDY/E1vTsLr6mUvrhO4kpoK0tdvdgRUVFv/tWVlb2+bjBiM7/JaDXG37RyTbqB10fP1xxzSMaeaHZFanyM+h1GFMytBEA/ZkmhkeauxN23ETa0uSQt6dXs3lkOM6aXY2H39+JPe29WLu3C5/t6cSSCanTHqGGDfV2bGwIf+3NqLbiyNFFKp9RzDfn1uDFtfUAgNfWNSY9PNLZ48X6yLiIyRV5qC1O3PegZMvNNmLu6EJ8sc+GvR29qO9yaeL8n/54L7a1hL/nTq7Iw2+/OXPIga7qQgv+v6vm4ZuPfwJ/UMJTq/bg2EllOFrFZqHnPou1jly1eKxq5zFSR0WaLO77X3hE4c//8zVyssLtACNl6/Xhp699jbe2tMh/V1tswZ8vnqPJ5gwtWjCuGK/etATv1LXi/721TV5cf7euFR9sa8Ml82tx20mTVGuLsrt8uPv1LVi+oUn+u9K8LNx//mycPL3/3xsykdGgl4NBANBgc+Gz3Z3Y2GDHjtYe7GjtHvCuoSyjHmOKczCj2orp1VbMqS3CnNpC1duYhstqNuHbR4/D1UvG4vM9XfjP+ka8ubkZ3Z7w70O+YAif7OrEJ7tiochsox6ledkozc+WQ5P+QAitTo/c7CJiSI2IiCix2pzDCI/kx95/bGfzCGWQkTZsTyjLxQfbIsdq62V4hEhDnGLziFm58IgYVGHzCKUjhkdSQE9P7AecnJz+F6HEOePi42hoos0juQrcqVlgMUGnAyRJG80joZAkJ7JHF+cg25i45pUKazaKckywufzY2uwc+AEq2NwoNo8wPDIcBr0OPzhxUqx95L2dWDye7SP9ee7TffL21YvHaur/1bwxRagpsqDB5sYnuzrQ5vQktYL/w+3tkCKTAE6YmnoLn8dNLsMX+8JjQVbuaMcVi9RtkWl2uPHoB7sAhNsmHrpk7rDHD8wcVYAfnzoFv3tzGyQJuP3lDXjrB8eiSAhBKmV/Z6883mhUoQUnTE2dhpq+fPeYcWjv9uKvq/ZAkoA7/m8jso16nD6ratjHXLmjHT/+v41oE+5KvOioGvzq7OnIV/AX6nSg0+lw6oxKnDi1HK981YA/v7cDrU4vgiEJ/1wTHvtx/bHjcd03xivysyMQbpR5Y1Mz7vtvXdy/8ekzK3HfeTNRkjf4Od6ZrKYoBxfNy8FF88IhekmS0OMNwNbrR2evF25/EAadDga9DnlmIyqt5sjP7tp5nU4UsXHn1+fNwMrt7fhoRztWbm+Xa76jvIEQGu3uQ/7+cDyBICu+iYiIEkj8+W+wv5/nZBmRk2WAyxfk2BrKKLvbYmskw2keEQMnezp6Umq8MlG6E8fWFOSoNLbGrf6aHlGiMTySAiQpNk97oDfc9PrYXV3i4wajvr6+3483NzdjwYIFQzpmqnL5wnfa5WQld2QNEF5oL7SEAxVaaB5pcrjluecTyhI7AkCn02FqpRWf7elEe7cXHT1elGpocUOSJLl5pCw/W7W7iNMB20cGr6PHi/9uCo8FK8wx4Zw51SqfUTy9Xodvzh2Fv3ywCyEJWL6hCdcdOz5pzyeOrDlpWuoFAo6bXI4/vLMDgDbCI7/931b5e/qVi8aMuFHp2mPGY9WODqze1YFWpxc/fe1rPHHFkYovCD7/+X45ZHTZwtEw6FN7QVKn0+Gu06ei1xfA858fQDAk4aYX1uGG48bjR6dMGdJd+/VdLvzuza1YsTnWNlKYY8ID58/CaTOHH0ahcGvFpQtG45w51fj76r14cuUe9HgDcPmCeOi9nXj+8wP4wUmTcPG8moSGbw+2rcWJu5dvwZq9XfLfWc1G/PrcmTh3TjUX6EdAp9Mh32xCvtmE0Qls30s12UYDTplRiVNmVEKSJOzt6MXXjQ7UNTlR1+xEq9ODjh4fuoTgu1GvQ1l+NqoLLagutGBaVT7m1BRiZk2BoneAERERZYK2bo+8XTbI5hEAKM3LxoEuFzo5toYySLMjdr3UFg+9NWS8GB4RRuAQkfqcnnB4RK8D8oZ5s9xwFFrEsTVsHqH0w/BICsjLi/2A4nb3f3eXy+Xq83GDUVOT3FEEqaTXG2keUegFpyg3CzaXH7Ze9V9odgs/BE8YRhp7INOqwuERANjW3I1jJmknPNJgc8MZqeieydaREWH7yOD964t6+IIhAMAl82phNiU/tDZU0fAIALy2vjFp4RFfIIRVkTaJohwT5mpofM9gzai2oiQ3C529Pny6qwO+QEi1UQaf7e6Ug0nFuVm4/eQpIz6mXq/DHy8+Aqc9tAo2lx9vbWnBis0tOGMEDRlD1eMN4F9fhAOvWQY9Lp2fHmP3dDodfn3OTLh9Iby6rgEA8NeVe/D5ni78vwtmY0plfr+Pr+9yYdnn+/HMp/vgC4Tkvz92chkevHA2KpLYGJRpcrKM+N4Jk3DpgtH4y/s78cKaAwiEJHT0ePHL/2zGox/sxHXfGI/LFo4edtNPX3a1deOR93fhjU1NEDPiJ00rx33nzUJlAf+NKfF0Oh3Gl+VhfFkezp0TP04rGJKgQ/i1gYiIiJQT1zwypPBIFg50ueBw+1X9XZVISWLTTtkwbmKsLoz9niUGt4hIfdHmkXyzSdHfS+ObR9Rf0yNKNP6EmAJKS2N367e1tfW7r/jxkpKSpJ1TOguFJPku7ZxsZRZxSyKV/z3eALyBoCLPeThild9w5kAOZFpVbPFLa6NrtjSJI2sKVDyT9HDW7GqMj7TXrN3bhY8ioQCK8QdDeP7z/QAAnQ6qt1QczviyPBxRWwggfN1ua0nOtbtmbyd6I2PDlk4pT8k2Cb1eh29EKkx7fUGsO2BT5TyCIQn3vL5F/vOdp05JWH1jhdWM+86bJf/5V8s3w65gc9aLaw7IQb9z5lSn1XgOvV6HBy+cjV+cOQ0mQ/jrf2O9Hac+tAoX//UzLN/QiJ2t3XC4/HD5AthYb8dLaw/g2/9Yi2Mf/BBPrdojB0dK87Lw+wtm4Zlvz2dwJElK87Jx77kz8e7tx+GMWZXy37c6vbjvf1ux6Hfv4+7lm0f0804oJGHVjnbc9PxXOPnPq/D6xlhwZExJDv7+7Xl4+ur5DI6QKgx6HYMjREREKmiPC48M/udAsf23s5ejaygzdESadvQ6oDBn6GN3S3Jj100HW3uINCUaHimwKNt2KT6fg80jlIbYPJICpk2bJm/v3r2739Exe/bskbenT5+e1PNKV9HgCKBg80hOfM1VhVW95oFd7SObAzmQaVWxRo+tSVqAHq66yMgaINweQCNj0Ovww5Mm49YX1wMAfve/rfjGxFIYhzB+Id29vqFJrs88cWo5aou1W5F//txR2FhvBwD8e30jfnp64q+R97fGApAnpODImqjjppThPxuaAIRH1ywar3yY842NTdje2g0AmF1TgIvnJbad44xZlTh5egXerWtFR48Pv/nvVvzx4iMS+hx98QaCeHp17GedG49L3ggltej1Olz7jfFYMK4Yt764Hvs7w61ya/d2Ya0wpuRwTAYdrjl6HL53wkTkc1SEIsaV5uLxy4/Cxno7HvtwF96pC4/fcnoCePaz/Xj2s/2YWpmPpVPLcfzkMhxRW9hvy1SvN4C1+7rw6a4OvPl1Cxrt8c2DxblZuOHY8bh6yVhNtlURERERUXJFwyP52UZYhjByu1RoKeno9qGqYOgjPIhSTbR5pDg3e1g3KVmyDMjNMqDXF0RnD0NXRFohSRKcaoVHhBv0oqNziNIJwyMpYP78+fL2p59+im9961uH3feTTz4BAIwaNQqVlZWH3Y8Or9cXkLdzhvAL2EgU58bCI129PlXvEN4rjq0pTXx4ZGJ5Hgx6HYIhCVubuxN+/JHYzOaRhDtrdhX+tnovNtTbsbOtBy9/2YDLFo5W+7Q0IRSS8MTK3fKfbzhugopnM7CzZlfhN/+tQyAkYfn6Jtx56tSENoNIkoT3t4UXXI16HY6dXJawYyvtG5Ni575yezt+ctpURZ8/EAzhkfd3yn++6/SpCb8zXKfT4b7zZuLzPZ3o9gTw6roGnDunOun/bv9Z34hWZ/jNmlOmV2Bief+jXFLZ7JpCvPn9b+BfX9TjhTX748bK9WVUoQWXLRyNi+bVDOnuQ0qcI2oL8dRV87C9pRtPrdqD/25qgjfSBLOtpRvbWrrxxEe7odMBo4tzMKEsD3nZRhgjLTMtDg+a7G402NwIhKRDjl+al4XrvjEeVywag9xs/hpHRERElKnanOGbUMqsQ2thFJtHOrgIThlAkiR0RtpCSvOG3joSVZqfjd5OF5tHiDSkxxtA9K0TpcMjeVlG6HSAJEEOsBClE77rmALmzJmD8ePHY8+ePXjttdfw5z//GUbjof90a9eulZtHLrjgAqVPM224vELziEJvzBcJ4RFbr7o/hNbbwnc4W83GhI04EJlNBkwoy8WO1h7sauvW1IzVLZHmkXyzEbXFvPsiEXQ6HX551jRc8MRnAIA/vbsd58ypRh4XvfDu1lbsioyJmj+2CPPHFqt8Rv0rycvGcZPL8P62NrQ4PVi9qwPHJTAosLOtB/Vd4bvrF4wrhjWFGxNK87Ixc5QVmxudqGt2oq3bo+hi/vINTdjTEQ4aLBxXjCUTSgd4xPBUWM34+RnTcNdrXwMAfvra13jnh8cm7bUzGJLw15VC68jx2g5cJUJuthHXHDMO3zl6LD7f04VVO9vR6vCgvceLXm8AE8ryMLXKipnVVswbW5ySo57S0ZTKfPzx4iPwq7OnY/mGRrz6VQM2NsTazSQJ2N/pkltl+qPXAcdNLsMl82txwtQKzfzMRERERETq6PUG5HGvZUMc4VkmLJ63MzxCGcDpDsAXDAf6y/KHP/K2JDcL+ztdcLj9mnovmyiTOYTQhtWi7FqDXq9DfrYRTk9AHq1NlE64epcibr31Vvzwhz9EU1MTHnroIfzoRz+K+7gkSbjrrrsAAEajETfddJMap5kWVGkeEcbWdLnUC48EgiF5hEYyx2dMq7JiR2sP/EEJu9t74kbZqKWjxyvfzT6j2gqdjgtwiXLUmGKcMasSb37dgo4eH578aDd+dOoUtU9LVZIk4fEPd8l/vvn4iSqezeBdNK8G728Lj5b555r9CQ2PLN/QKG+fNK0iYcdVy7GTyrC5Mdxm9PGODlxwVI0izxsIhvCXD2KtIz88eXJSn++S+bVYvqEJn+3pRKPdjT+8sx13nz0jKc/1zpYWORSzaHwxjhxdlJTn0SKdTofFE0qweILyI5Bo+AosJly1eCyuWjwWHT1erNrRjk92dWJnWzd2tfXA5Qse8pi8bCNqiiyYP7YYSyaUYOH4kriGOiIiIiLKbG3dsdBH+RCbi9k8QplGDEmVDjFsJSoRHmtzqdsaTkRhTndsHU/p5hEAsFpMcHoCcSEWonTB8EiKuOWWW/DMM89g48aN+MlPfgKXy4Wbb74ZJSUl2L59O+666y58+OGHAIDbb78dU6cqW5GfTsQ38jOteaTZ4UEw0vVVW5S88MjUSiuWowkAsK3FqYnwyBaOrEmqn5w2Fe/WtcIflPD/fbwH5x85CuPLEj8WKVV8urtTvgt9WpUVx09JjREtJ06rQHl+Ntq6vXhvaxtaHB5UFoz8F+ZQSMJ/1oe/J+h1wFlHVI34mGo7bnIZHv8oPJZo5Y52xcIj/17fiH2RNoMlE0qwaHxywwY6nQ73nz8Lpz28Ch5/CM98ug9nza7GUWMSG+wIhiQ88kEscHVTigSuiKJK87Jx/pE1OP/I8PeCUEhCR48X3kAIvmAIoZCEcqsZVrORAVYiIiIiOqx2MTwyxCaFUmH/jm6O36D01xEXHhnB2BohPNLe7WV4hEgD4ptHlA+PFFhMaLC54XT7IUkS38uhtMJ+rRRhMpnw5ptvYsaMGQiFQrj77rtRVlaGrKwsTJs2DcuXLwcAXH311bj//vtVPtvU1utVoXkkN/bi1tWrXlKxvitWn57MsS3TqvLl7a3N3Ul7nqGIjqwBws0jlFhjSnLxnaPHAQC8gRDuevVrhKJDCTPQYx+Ki+ATUuaHS5NBj0sXjAYQXsx/ce2BhBx37b4uNNrDI2u+MalM0REvyXLkmCLkm8MBxA+3tcEbOLRhINH8wRD+IgQskt06EjW2NBe3R55LkoCfvLop4Z/va+sasLU5HPKbNaoAx05KzigeIqXo9TqUW82oLc7BhLI8TKrIR4HFlDKvB0RERESkjrZuj7w95PAIm0cow3QkqHlEDJ50qjxynojC4sIjKow/jz5nICTB7U/++75ESmJ4JIVUV1fjq6++wh//+EccddRRsFgsCAQCKCwsxBlnnIHXX38dzzzzDPR6/rOORFzzSJZCzSPC2BqbimNr6m1ieCR5zSPThaaR6GKg2rY0snkk2W47aRJGR76u1u7rwvNr9qt8RupYuaMdn+7uBACMKcnBGTMrVT6jobl0fi30kbXNl744AH9kduxI/HtdbGTN+UeOGvHxtMBk0OPkyPidbm8An+zqSPpzvrauAQciIcBjJpZi/tjipD9n1DVHj8PsmvD3zl1tPfjL+7sGeMTguXwBPPj2dvnPPztjGhfYiYiIiIgoI7U5xbE1Q1sMLxEWwBkeoUzQ2RN7n31EY2uE1vBOXjtEmuAUwiPqjK2JrR2KI3SI0gFTBikmOzsbt99+O7788ku4XC74fD7YbDb873//w9lnn6326aWFuOaRbKWaR2I/gHapmF6u73LL28kcW1OWny1/zlprHsk26jGhLFfls0lPOVlGPHD+LPnPv1+xDQ1CYCkTBEMS7n9zq/zn20+eDKMhtV6KqwstODESimh1evH+1rYRHc/jD+LNr5sBALlZBpwyPbXCNP05fVZs/M6bX7ck9bl8gYNbRyYl9fkOZjTo8fsLZsMYSRY9/tEurN3blZBjP7VqjzzX++TpFVg8IbmjeIiIiIiIiLSqTRhbU5Y3tNbO/Gwjsozh9yAYHqFMENc8MsSmHlHcyCdeO0Sa4PSoHB4R2k7EFhSidJBaK1Z0CJNJ+W+K6U5sHlFqbE1RrjaaRw50KdM8otPp5NE1HT3euHmtauj2+LGvM/y5T62yptxifipZMrEU34qMPen1BXHnK5sQSEBzRap4dV0DtrWEA1NH1BTg7NnVKp/R8FyxaIy8/cIIG2Te29qK7kho7/RZVbAo9H1XCd+YVIrcyOfzzpYW+ALJ+1p/dV0DGmzhAOCxk8tw1BjlWkeiplVZcdtJ4dBKSAJ++K8NI/7lqdXpwV9X7gEAGPU6/PT0qSM+TyIiIiIiolQVN7ZmiM0jOp0OZZH2BbGRgShdxY+tyepnz/6V5MauNV47RNoQN7ZGhfCIGFgRgyxE6YArpEQH6fUJzSMKja3JzzbKd2ur2jwitEDUFFmS+lzTKrUzukZsP5lRbe1nT0qEn54xFZXW8N0xn+7uxAMrtql8Rspw+QL44zvxozf0+tQcvfGNiaUYUxIOmH28swM7WoffIBQ3smZueoysiTKbDHJLi9MTwGd7OpPyPL5ACI+KrSMnKds6Irrp+IlYMC4cXGm0u/GL/2yGJEnDOpYkSfjNf+vkuaFXLBqD8WV5CTtXIiIiIiKiVCPegFU+jCaF6AJ6l8uXUTfzUGZq707M2JrSuJFPDI8QaYFD9bE1QniEzSOUZhgeITqIyxtrHslVKDyi0+nk9hGbBsbWlOdnw2xK7t3/U6u0Ex6JjqwBGB5RgtVswsOXzpEDU0+v3otXv2pQ+ayS7/9btRetztjojYXjU3f0hl6vw5VC+8jD7+8c1nHanB58tKMdAFBVYMaiFP5/cjhnzIqN4VkRGc+TaC9/WY9Ge/j79/FTyjB3dFFSnmcwDHod/nzJHFjN4dfPNzY24aUv6od1rJe/rMd/N4X/n1nNRnz/RPVCMURERERERFoQDY9kGfXDWiyLLqBLUjhAQpTOxOYRcWz8UInBE46tIdIGp9rhEXNs7ZDNI5RuGB4hOojYPKLk+ITinFjyXw1uX1D+4TeZI2uiomNrAMhjPNSyuTEWXplRXaDimWSOheNLcM85M+Q///TfX2P9AZuKZ5Rc21u68diH4WYIg16Hu9Jg9MblC8fIvzz/b1MztrUMPQT25Mo9CIbCrRTfnDsqZZtY+nPc5HJYImG8t7e0JPzOLm8gKH9tAcAPT5qc0OMPx6hCC353/iz5z7/4z2Z8sK11SMfY3tKNu1/fIv/5/vNnj+iNHiIiIho6n8+Hnp6eQf0XDAYHPuBB/H6+yUpENFRtkfBIWV42dLqh/w4dtwjezfAIpbfoe91FOSaYRjCmvMBigiHynlVnL8MjRFoQN7bGrMxN4KKCnFhgxeHi7zWUXhgeITqIxy80j2QrFx4pyjVFnj8ElxBgUUqDMLKmNskjawBgYnme3DyhleYRg16HqZX5A+xNiXLFojG4fOFoAOGxG1f9fS3WJGmsh5q8gSBu+9cG+CKhge8eMw4T0mD0hiXLgBuPGy//+aF3h9Y+0ub04IU1+wEAZpMe3zl6XELPTyssWQacMLUcAGBz+bFmb1dCj//yF/VodoRnXp84tRxH1BYm9PjDddbsalwT+TcNhiTc/MI6rBtkQMzlC+B7/1wHjz98zVyxaDTOnF2VtHMlIiKivv3qV79Cfn7+oP574403Bjyez+fDn/70J8yfPx+5ubnIyspCcXExzjrrrEE9nogo0/kCIXncddkwRtYAQGm+OH6Di+CUviRJkr/GRzKyBgg38JZEbmjp5NgaIk2IC4+o0jwijK3xKL+eR5RMDI8QHcTti4VHLEke3SIS76juUmF0Tb0YHlGgeSTbaJAX0He19cAbGPqdaongDQSxq60HADCxLC/p43oo3t1nz8Ci8cUAgG5PAFf+fS3e3tKi8lkl1kPv7ZQDUlMq8nH7yeo3QyTKFYvGyG9YvbWlJW4E1ECeXLkH3kA4HHClcJx0dLowuuaNjU0JO67HH8SjQuvIbRpoHRH94sxpOCsS+vD4Q7jmmS8GbBjq6vXh2//4Ajsj35enVubjF2dOT/q5EhERUf9yc3P7/c9o7P9uv+bmZhx55JG444478OWXX8LlcsFoNMJms+F///sfzjnnHHznO99BKJTYljYionQihj3Khxse4fgNyhC9vqB8U8pIwyMAUBI5RmePD5Ikjfh4RDQy0cBGbpZhRM1CwyUGVsQROkTpgOERooO4VAqPFOXEwiO2XuVfbOq73PJ2bVHywyNAbHRNICRhd1uvIs95sB0tPQhExmbMqLaqcg6ZLMuox9+/PR/HTS4DEL6L5qbnv8Jf3t+pWqAokdbu7cKTK3cDAEwGHf50yRFpFVAymwy4+fgJ8p//PMj2kYNbR64/dsIAj0htS6eUIzcyBm35hqa4ZPxIvLT2AFqd4Tf7TppWgVk12hq7pdfr8MeLj8Di8SUAALvLjwuf/AyPfrBTHlck2tXWjfMe+wRrI+0suVkGPHb5kWl1zRAREaWqgcbWnHXWWYd9rN/vx+mnn44tW7ZAr9fj3nvvRXt7O3w+H7Zu3Ypzzz0XAPDMM8/gpz/9qVKfEhFRymnvFsIjVoZHiPrTIVwvpQm4Yak0L/zevS8YYssAkQZE318tUKF1BDi4eYThEUovDI8QHcQtjK0xZ6nUPOJSoXmkK9Y8UlOc/LE1ADCtKhbWUGt0jdiUMJ3hEVXkZBnx9NXzcN6cagBASAL++O4OnP7Qx1i1oz1l0/w7Wrtxw7IvET39H548GTOqtbW4nwjfWjAaFZE3rd7b2orlGxoHfMxfV8VaR65YmN6tIwCQm23E+UfWAAi/xrz6VcOIj+nxB/H4R7vlP9920qQRHzMZso0G/PWqozBvTBGA8AibP7yzA+c//gke+3AX1uzpxJtfN+OOlzfi3Ec/wYHIa1FZfjZeuG5RWox4IiIiynSPPfYYNm7cCAD4/e9/j1/96lcoLS2FTqfD1KlT8dprr2Hp0qUAgD/96U/Ytm2bmqdLRKRZbWJ4JN88rGPEh0c4foPSlxiOigY/RkK8djoZvCJSXTQ8osbIGiA+tJKoGwWJtKL/XlGiDOTxa6F5RPlf3g4I4ZHRCoytAbQRHtkshEfScWE/VZgMevzp4jkYVWTBkyv3IBiSsKejF1f9fS0mlOXizFlVOGl6BcYU58JqMUKn08mP7fEG0Gx3o9nhQYvDg2aHB82O2J9bnB4EQxL0OsBo0KMsLxujiiyoKbJg5qgCzBtThHGluXHHHKl9Hb24/Ok1sLnCPzguHl+CG9K0XcNsMuCu06fih/8KLwj87LWvMXNUwWEX/b/a34VlnwmtI8eNV+xc1XTV4jFY9nn48172+X58e8lY6PXD/5r755oD8huHp86owMxR2v3+ZTWb8NL1i/DIB7vw6Ac7EZKAjQ0ObGzoe8zR9Cornr56HqoLlQkyEhERUXL95S9/AQBUV1fjtttuO+Tjer0eDzzwABYuXIhAIIAnnngCDz/8sMJnSUSkfW3dHnl7uGNryvJj7z+KzQxE6SY+PJKAsTXCjZ8dPT6MLxvxIYlomDz+IHyRGxPVCo9YLbHldaebbUSUXhgeITpItHnEZNApOistrnlEhfBIvS08tsao16GqQJkFu6mRsTUAsK2lW5HnPNiWplhohc0j6tLrdfjxqVNx5qxq/Gr5Zny53wYA2N3ei0c+2IVHPtgFIDzKIs9shMcfglv4QXGwunp92N4a//VWkpuF46aU4dQZlTh2UhksI2gd2tvRiyueXiPXyR5RU4CnrjoKhhEEBbTum3NrsHpnJ15d14BeXxC3vLAO/7nl6EPGjezv7MV1z30FXzD8b/btJeOGfbdUqplUkY8lE0rw6e5O7O3oxce7OuRxTUNld/nwlw9iI4JuO2lyok4zaYwGPW4/eTK+MakUd76yCXs7Dh1VlptlwDlzqvGLM6cjN5s/ohIREWmRz+dDVtbg797dsGED9uzZAwA4//zzYTT2/Rq/YMECjB8/Hnv27MGrr77K8AgRUR/anLHF8OE2eJbkxh7XzvYESmNis05ZIsIjbB4h0gyn0PSh1tgai8kAo16HQEji2BpKO3xnnuggbl84PHLwomeyFQnhEZvCY2skSUJDpHmkutCi2CJ3eb4ZpXlZ6OjxYWuzE5IkJbT9YSDBkIRtzeEQwejiHNV+0KB406utePmGxVi+sREvrqnHF/u7IE6u6fUF0esLHv4AgiyjHpVWM7KMeoQkCb5ACG1OrxxeiOrs9eG1dY14bV0jzCY9jp1UhlNmVOLEqeVx12Z/QiEJz362D79/axs8/vDxp1bm49lrFiDfnP5fW785bwY2Ntixq60H21q68f0X1+O+82ai3BoOhzhcfnznmS/kcNwxE0txxynaDz0k0lWLx+LT3Z0AgOc+3Tfs8Mgf39kht9qcO6c6rsVJ6+aPLcYHdxyHvR29+HK/DesP2GE26XH8lHIsGl+MbKOyr71EREQ0OPPmzcPmzZvh9XphsVgwZcoUnHrqqfje976Hmpqawz7uiy++kLeXLFnS73McffTR2LNnDxobG9HS0oLKysqEnT8RUTpIxNiaAotJXuzi2BpKZ3HNI/mJGFsjNI+ocOMnEcWIY2KsKr3vrtPpYLWY0NXrY3iE0g7DI0QHiS76KjmyBgCKc9RrHnG4/ej2hqu1aouVHRMwrcqKj3d2oLPXh/Zur7zQrIS9HT1y08wMto5oil6vwzfn1uCbc2vQ6vTgrc0t+LrRgWaHG012D9y+ICxZBphNBljNRlQXWlBVYI78Z0FlZLs4N+uQQFIoJKGjx4s9Hb34ar8NX+23Yc2eTjmQ4vGH8E5dK96pa4VBr8OCscU4ZUYFlk4px+jinENGjTg9fny4rQ3LPtsvt6UAwISyXCz77kIU5oz8F9RUkJNlxOOXH4lzHl0t/z9cvasDVy0ei7ZuD1Zub0dn5HvbpPI8PHb5kYq2O2nBSdPKUV1gRpPDgw+2t6G+y4XaIY4J29LkwAtrwuNvcrIM+Onp05Jxqkml0+kwviwP48vycPG8WrVPh4iIiAbhq6++gsFggF6vh9vtxoYNG7BhwwY8/PDDeOSRR3Ddddf1+bitW7fK2xMm9D/Gcfz42DjDurq6IYVHGhoa+v14c3PzoI9FRKRV7WJ4xDq8JgW9XoeSvCy0Or1sT6C0JoZHxMad4RJH33DkE5G6HBpoHok+d1evDw4XwyOUXhgeITpINEwwkrEVw1GUG3uRU7p5pL7LLW/XFg1tIXOkplbm4+OdHQCAumanouGRzY2xkTUMj2hXhdWMq5eMTdjx9Hodyq1mlFvNWDS+BADgDQTx6e5OvLOlBe/Wtcp33wRDEj7b04nP9nTi3jfqkJtlwOTKfJTkZsMbCKLHG8DmRgf8QSnuOa5ePAZ3njY140ZvTK7Ix8OXzsWP/m8juj0BuHxBPLlyd9w+pXlZ+Pu352dk04/RoMfli8bgwbe3Q5KAxz7chQcumD3ox0uShHte34JQ5Mvt1hMmobIgM8b+EBERkfLKyspw22234YwzzsCUKVNQXV0NvV6PXbt24fnnn8eDDz4Ij8eD66+/HgaDAddcc80hx+jo6JC3y8vL+30+8eOdnZ1DOtfaWgZSiSj9tXd7AAA6XXj87nCV5mWHwyO9PoRC0iE3yRClg47u2PvrpcMc8yQqEZpHOnsZHiFSk9j0oeZ7zFZz+L3/bm+Ar6eUVjJrVYtoEFy+cAOH4s0jueo1j9TbXPL2UO+CHylx3MK2lm4cP6X/NxQTaUuTQ96eUV2g2POS9mQbDVg6pRxLp5TjvvMkbKi34e0trXh7Swv2d8auj15fEOsP2A97nDElOXjg/NlYPKFEgbPWplNnVGL+2GI8/N4OPL/mAIKRpENOlgHfmFSKH586RfHvM1py6fxaPPHRbvR4A3jpi3pcNK8GR40pHtRj/72+EV/sC7fbjCvNxTXHjE3imRIREVGmu+OOO/r8+8mTJ+PXv/41zjjjDJxwwglwu9247bbbcM4556C0tDRu356eHnnbYum/5TInJ/Yzovg4IiIKi46tKcnNhnEETZ7RBoVgSILd7Y97T5IoXcQ3jyRibI3YPMKxNURqihtbY1FvmdsaCa5IEtDjC6g2Qoco0RgeIRKEQpI8tsascHjEYjIg26iHNxCCrVfZmqv6rtjieE2R8mNrorY2O/vZM/G2NLF5hA5l0Otw1JhiHDWmGD89fSp2tPbgnS0t2Nhgx/bW7rimHgCoLjDjlBmVkdBE0YjewEkXxblZuPfcmbhqyVis2dOF0cU5mD+uCNlGZb+valFJXjbuOGUy7n2jDgDw839vxhu3HjPgCJ8drd34xX82y3++++zp/P9JREREqlq0aBF+/vOf4xe/+AW6u7vx3HPP4fbbb4/bRxwhKUnSwYeIEwqF+nzcYNTX1/f78ebmZixYsGBIxyQi0pJQSJLH1pSNsEUhbhG8x8vwCKWlaHgk32xMyPv84nXC5hEidYljYtRtHok9t8PlZ3iE0gbDI0QCbyD2ZpXSzSM6nQ7FuVlodnjQpfTYGhWbRyaU5cFk0MEflBQNj0iSJIdHyvKzFR2XQ6lDp9NhSmU+plTmy3/X6w2PYzGb9DCbDAMu+meyCWV5mFCWp/ZpaM5Vi8fi1XUN2NzoxLaWbvx99V7ccNyEw+7vcPtxw7Kv4PKFx6p9c+4oRVuaiIiIiA7n8ssvxy9+8QsAwKpVqw4Jj+TlxX4WdLlc6I/bHQtpi48bjJqamiHtT0SUamwuHwKRZs/ykYZH8mOL4B3dXkyuyO9nb6LUFB1JXZY38pE1QPhG0/xsI7q9AXT2sHmESE1OT0DeVjU8Ijy3OEqHKNVxxYtI4PYH5e2cLOXv6C7KCf/yZuv1DXhXViIdEJoUaouUDY9kGfXy4vLu9l54A8EBHpEYjXa3XG/G1hEaitxsI8rys5FvNjE4QsNi0Ovwu2/OQvSG2ofe24kdrd197hsKSbjtpfXY29ELAJheZcXvvjlLqVMlIiIi6tfYsWORlRX+Pba5ufmQj5eXxwKvra2t/R6rpaWlz8cRERHQLozgGGl4RFxMF49LlC48/iB6vOHF5dIEhUcAoDRy7fG6IVJX/NgaNcMjsX4GpzvQz55EqYWrXkQCMTxiViE8Eq2/C4QkdHuVe7FpiIytsZgMKM1TvqpyemR0TTAkYWerMrOtNzdyZA0RqWd2TSGuWjQGQPi15/zHP8UH2+IXVJodblzz7Bf4cHs7AKAox4S/XnkULCq8PhEREREdTvTGh75GzUyfPl3e3rVrV7/HET8uPo6IiIA2pxAesSZybA0bFCj9REc8AfFNOyNVEnnvvtsTUOwGSCI6lBge0crYGjaPUDpheIRI4PbFfuhTemwNABQJsxNtvcr88hYKSWiwhZtHaostQ54tnQhTq2L1mEqNrqlrcsjbM6oLFHlOIiLRj06dIofXerwBfPfZL/HrN+rw3Gf78PhHu3DKn1fho0hwRK8DHr3sSMVHixERERH1Z+fOnfD7w2+Ujho16pCPL1q0SN5evXp1v8eKfnz8+PEoLS1N4FkSEaW+tm6xeWRko5fjwyNsUKD0I35dJ7J5pES46bJLoffuiehQTo2ER8TnFgMtRKmO4REigcevbnikJFf5H0Dbur3wBUMAlB9ZEzWtKtb8sa2l79ENiba5ic0jRKSufLMJ/3fjYpwxqxIAIEnA3z/Zi18t34L/99Z2dEfmd5bnZ+Nv356PoydyEYWIiIi05W9/+5u8vXTp0kM+Pm3aNEybNg0A8Oqrr8Lr7XuR8qOPPkJDQwMA4MILL0zCmRIRpba2bo+8XTbCsTViE0NHN8MjlH7ERp2Ejq0Rg1fdDI8QqSVubI1ZzbE1QvMIwyOURhgeIRK4xOYRFcYCFOUIzSMuZX4Arbe55G217mgXwyNKNI9IkoRNDeHmkQKLCaN5Jz8RqSQny4jHLjsSt588uc+PX3BkDd794XFYOqVc4TMjIiIi6t+bb76JP/7xjwCAoqIiXHHFFX3ud8cddwAAOjs7ce+99x7ycZ/Phx//+McAALPZjFtuuSVJZ0xElLrixtaMNDzC5hFKc51Jax4Rrp1eXjtEaomGR7IMephN6i1zW81GedsZuQmQKB0YB96FKHO4heYRswrNI8W5saRiV68yScX6rlh4pKbIoshzHqw0Lxtl+dlo7/Zia7MTkiQldXxOs8Mj/3I8u6ZAlVE9RERROp0O3z9xEs45ohpbm51w+4Nw+4OYUV2AObWFap8eERERZaB//OMf+Otf/4ozzzwTixcvRmVlJSoqKiBJErZv347nn38ef/vb3xAMBqHX6/HUU0+hsLCwz2N95zvfwXPPPYdVq1bh/vvvh91ux80334zKykps3rwZv/zlL/Hll18CAO655x6MHj1awc+UiCg1tPckbmxNUU4W9DogJMU3NBClCzEUJY6aGalS4VidvHaIVBNta7ZajKqu7bB5hNIVwyNEArdP3bE1RcLYGptCY2vqu9zytlrNIwAwtTIf7d1e2Fx+tDq9qCwY2S/C/Ym2jgDh8AgRkRaMLc3F2NJctU+DiIiICJIkYc2aNVizZk2/+5WWluLpp5/Gueeee9h99Ho9li9fjnPPPRerVq3CE088gSeeeCJuH51OhzvvvBM/+clPEnL+RETppl1sHrGOrEnBoNehODcLHT2+uIYGonShyNgaXjtEqok2j4jhDTUUMDxCaYrhESKBxy+GR5SvuyoWxtZ0qTG2pki98Mj0Kis+3tkBANja4kxqeOTrRru8PWtUYdKeh4iIiIiIKBV95zvfwRFHHIF3330Xq1evRkNDA1paWhAIBFBcXIzZs2fjlFNOweWXX47c3IHDr4WFhfjoo4/w4osv4p///Cfq6urgcDhQXl6OJUuW4Prrr8fChQsV+MyIiFJTW7cHAJBvNiakLbk0LxsdPT509PiS3gBMpDSxqacskWNrcsXmEYZHiNQQCIbQ4w03jxSoHB6xmoXwiIfhEUofDI8QCcSxNTlZyl8eajSPHBDG1tQWqzO2BgCmVVnl7a3NTiydUp6052LzCBERERER0eHpdDocddRROOqooxJ6zMsuuwyXXXZZwo5JRJQp2rrDC9Vl+YlZCA83KHTDFwzB6QmovgBHlEgd3bFgR2l+4sbWlAhBFI6tIVJHNDgCxIc31JBvjq0hOt2BfvYkSi3KVysQaZg4tsacpfzYmmIhPNKlUHikIRIeKcoxIV/FF9upVfny9tbm7qQ9jyRJcnikNC8bVUlsOCEiIiIiIiIiIhoJty8IV+Q9y0S1KJTmxd6D5PgNSjfRr+mcLENCbxAVr792XjdEqhBDGmqPrTGbDMg2hpfZ2TxC6YThESKBO25sjfLhkcKc2IudEuERXyCEZme49rK2WL2RNQAwoSwPWYbwt6Rtzc6kPU99l1ueiTe7poC1nEREREREREREpFl2d+w9QvG9w5EoFRbBxZYGonTQEWkFKU3gyBoAsFqMMOrD7yWzeYRIHdG1HQAosKg/XCPa3CWeF1GqY3iESCA2j6gRHsk2GpCXHX7B63Il/wfQJrsbkhTeri1SNzxiMugxsTwPALCnoxceIciTSJsa7fL2rFEcWUNERERERERERNolLkgVWhIzgqNUGH/TwUVwSiO+QEi+ZsSGnUTQ6XQoiRyzs5ehKyI1iA0fao+tAWLtJ06GRxJmR2s3nly5G1uTeJM59Y/hESJBXPNIljqXR1Fu+MXGpkDzSL3NJW/XFFuS/nwDiY6uCYYk7GztScpzREfWAMARtQyPEBERERERERGRdjlcwl3WyWge4fgNSiNiqCPRzSPiMTt7fAiFpIQfn4j6J4Y01B5bAwBWc/hm8F5fEIFgSOWzSV2SJGHljnZc+bc1OOXPq/DAim248m9r4Qvw/6kaGB4hEojhEbMKzSMAUJwTTi/b3X4Ek/wDaH2XW95Wu3kEAKZXWeXtZKUKNzXY5e2ZbB4hIiIiIiIiIiINs8dV9CcqPBJrZGB4hNJJR3fshkyxYSdRSiLhkUBIimtAICJliG1cWmoeAYBuT0DFM0lNHn8Q//riAE59aBWu/vtafLyzQ/5YR48Xa/d2qXh2mUv9gVBEGuJReWwNABTlhn95k6TwC2FxbmLr9URi80htsfrhkWlieKQl8eGRUEjC5sbwcasKzCjPNyf8OYiIiIiIiIiIiBLFkYS7rNk8QumqI9nNI7li8MqHwpzkvXdPRIcSQ1uJClSOhHgODrdfXt+jgbl8AZz5yGrs7eiN+3ur2QhnJIjz3tZWHDOpVI3Ty2hsHiESxI+tUbd5BAA6k/zLW32XEB4p0sDYmsp8eTsZzSN7OnrR4w2/6MyuYesIERERERERERFpmzMJzSNlQiNDe3fyR2cTKaWjWwyPJH4RV2wzYfCKSHlOd6zdw2pRvx9BbD9hG9HQrN7ZERccmT+2CE9ecSRW3bkURr0OAPD+tlZIEkeEKY3hESKBGB7JManzwhP3y1uywyO28NganQ4YpYHwSEleNsojn//W5u6Evyh83WiXt2fXFCb02ERERERERERERIkmNo8UJig8UpzLsTWUnjp6hLE1SWgeKckVb/xk8IpIaWJAQxtja2LriGKwhQa2vt4ub99//iz8341LcNrMKhTmZGHBuGIAQH2XGzvbelQ6w8zF8AiRwC2MrTFnqXN5xCf/lWkeqcg3I9uoTtPKwWZUh0fXONx+7O90DbD30Gw4YJe3Z41i8wgREREREREREWmbIwnNIyaDHoU54WN19jI8QulDDEMlJTwiHJPXDpHykvGaOBLiObB5ZGjE9boTppbHfeykaRXy9rt1rUqdEkUwPEIkiDaP6HVAliG9wyO93gC6esPp6NHFOUl7nqGaO7pI3l53wJbQY3+xL3w8nQ6YM7owoccmIiIiIiIiIiJKNLsrOQtl0YX1Do6toTQSHx5Jwtga4ZgdSb7xk4gOJY5ys2ogPCK2n4jBFupfMCRhU4MdAFBVYEaF1Rz3cTE88v5WhkeUxvAIkSDaPGIxGaDT6VQ5B6XG1tTbYq0eNcXqj6yJOjJJ4RGnx49tLU4AwLRKqyYqzYiIiIiIiIiIiPqTrLuso4vgbn8QvV5W7VN6iAuP5Ce+eURsM+noZfCKSGlOT+z1Kt9s7GdPZYgBFifDI4O2s60bvZH12Ll93Og9uiQHk8rzAITH23DEnrIYHiESRJtHLFnqjXApF8MjziSGR7rc8nZtkXaaR46oLYA+kttZt9+esOOu229DSApvzx9b1P/OREREREREREREGuBI0l3WcYvgXJShNBFt0sky6pGfnfiF5RI2jxCpKvqamJNlgEml6QEi8SZljq0ZvPXCyJo5tYV97nNipH1EkoAPt7UpcFYUpf6VRaQhnkh4xGxSLzxSlherZ0pq80hXrHmkVkNja/LNJkyuyAcAbGtxJuzOhy/3xVpM5o0tTsgxiYiIiIiIiIiIkil6J3O+2QiDPnFNyQyPUDqKfi2X5WUnpVm8JDd23XSyeYRIcdHXxEQ2cY1EQVzzCFu8BmuDEB6ZO7rvm71PmlYub7+/leERJTE8QiQQx9aoxWoxIiuSmGxPYnpZHFtTW6SdsTUAcOSY8ItFSAI2RuaejdQX+7rk7fkMjxARERERERERUQpwJGmhLG50djcXwSn1BYIhdLnCX8ulQkNIImUZ9bBGRmV0MnRFpLhou4fY+KEmqyXWcOTg2JpBW18fvtnbqNdhZnVBn/vMHV2E4tzw9/KPd7bDGwgqdn6ZjuERoghJkjQxtkan08m/vCU1PCKOrdFQ8wgAHCkkDcX6quHyBoLYUB8+Tm2xBZUF5v4fQEREREREREREpDJJkmBPUnhEXFxn8wilgy6XD1JkbLnYrJNo0WN39DB0RaQkbyAIjz8EID60oSaOrRm6bo8fO9t6AABTq/IPux5r0Otw/JQyAECvL4jP93T1uR8lHsMjRBG+YAihyA+XajaPAEBpJDzS5fLBHwwl5TkaIs0jJoMOFVZthSmOHF0ob6/bbzv8joO0udEJbyD8/5GtI0RERERERERElAp6fUEEI29YJj48wrE1lF46hAYdJcIjPd4APH7eCU+kFHEsjFbG1uSbYyEWJ5tHBmVTg0MO+s2t7XtkTdRJ0yrk7fe3tibztEjA8AhRhMcXC2mo2TwCAOWR8IgkAV1JmJ0oSRIOdIXDI6MKLQmdl5oI40pzUZQTfvFfd8AGKfpKMkwcWUNERERERERERKlGrMBPZnikkw0KlAY6e2MhqNL85IytAYASobWnMwnv3RNR38RmD62MrTEa9MjLDgdInJ7AAHsTAHlKAADMqS3sd99vTCqFyRBev3x/a9uI1wppcBgeIYpw+WPf2NVuHomfOZr45H9Xrw8uXzgVrbWRNUB4dM/cyOgam8uPvR29Izrel3Hhkf6TjERERERERERERFrgcCUvPFKUE1sAt7m4AE6pT2zQKclNXvOIGB7pSOLYeSKKJzZ7WDXSPAIA1kj7iIPNI4Oy/kBs2sBcYQpBX/LNJiwaXwIAaLS7sbW5O5mnRhEMjxBFuH2xijnVwyNC8r+t25Pw49fb3PK2FsMjwEGjaw7Yh32cUEjCF/vCL0ZFOSZMKMsb4ZkRERERERERERElX1zzSE5iF8oKc2PH44IXpYO4sTX5yR9bA8S3nRBRcjm0Gh6JnAvH1gxMkiSsj6z3FVhMGFeaO+BjTpxaLm9zdI0yGB4hinAL8wnNKo+tSXbzSH1kZA0A1BZpNTwSawhZJyQRh2pXe4/8Q8W8scXQ6bQ1ooeIiIiIiIiIiKgvDndsMTzRzSP52UZ5lLXdxQUvSn1i80hpXjLH1sTeu+/gyCcixYhjYaJtH1oQHaHjDYTgEdYZ6VANNrc87mtObeGg1utOnFYhb7+3rS1p50YxDI8QRYjf1FVvHkl2eMQmhEeKLQk/fiIcUVuIyO+vWLd/+OGRNXs65W2OrCEiIiIiIiIiolQR1zyS4PCITqeTj2l3cwGcUl+7EB4Rm70TrTRXGFvTw+YRIqVodmyNcC7dQsCFDiXeKD6ntnBQj6ktzsHUynwAwMZ6e1KmNVA8hkeIIty+kLyd9uGRLmFsjUabR3KzjZhebQUAbGvpRptzeC8IHwhJxCUTShNybkRERERERERERMmWzPAIABRGwyO9bB6h1Ce2gJQmMzwivHffyeYRIsU4PUJ4xKyl8EisBYVj4Pq3od4ub88dXTjox504LTa65qPt7Qk8I+oLwyNEEeLYGovaY2uEH27bk5BebohrHtFmeAQAjp88shcEly+AT3aHm0cqrWbMiIRRiIiIiIiIiIiItC7Z4ZGCnPAxu70B+IOhAfYm0raOyE2YRr0uKddLVInQPNLJ5hEixST7NXG4xCCLGHChQ60/YJe3B9s8AgDHTCyTtzc3OhJ4RtQXhkeIItyZNLamKxweyc0yoChHOy+yBztBSBO+v611yI//eGcHfIGQfKzBzE8jIiIiIiIiIiLSAnGhrNCS1c+ew1OUEzumk3dLU4qLjpApycuCXp+894FLhBs/O9g8QqQYpzs2EkZs+1CbGGTha+nheQNB1DU5AQDjS3NRmDP4n2umRMbWAMCO1u6EnxvFY3iEKMLti73wqN08YjYZYDWHX/wSHR4JhiQ02sNja2qLczQdqDiiphDFkST36p0d8AaCAzwi3nt1scDJydMqEnpuREREREREREREyWR3KTO2BgDsXPCiFBYKSejqDQc5kjmyBgCsZiOyDOGltQ42jxApRrtja8TmkUA/e2a2uiYnfJGWszlDGFkDAMW5WSjNC68V7mztSfSp0UEYHiGKcPu00zwCxNpHEh0eaXF64A9KAICaIu2OrAEAg16H4yeH66h6fUF8sdc26MeGQhI+3N4GIPzvuXhCSVLOkYiIiIiIiIiIKBmUGlsDxAdViFJNtyeAQCj8nndxbuJbekQ6nQ4lkUXMzl42jxApRWz1KNBQo370RnAg/nWb4m2ot8vbc4cwsiZqUnm4faSz18eRYUnG8AhRhNsfm+tp1lB4pNcXRK83cWnF6MgaABhdrO3wCAAsnRobXfPBtrZBP25Dg12uDTxmUqkm/k2JiIiIiIiIiIgGK7pQptMB+ebEV/SLo3DsLi6CU+qyu2Nfv0VDGIUwXNHwSFevD6FIaIWIkkt8TczL0s7YGivH1gzK+gN2eXvu6KIhP35yRZ68vYPtI0nF8AhRhNsvNI+oPLYGAMryzfJ2IttHxPBIbbElYcdNlmMnl8EQmVH5wbbWAfaO4cgaIiIiIiIiIiJKZdE7mPOzjdDrEz96uiiXzSOUHmzC12+hAo0EJbnhGz+DIYlNA0QKiY6ESdZr4nAVxI2t4feDw4k2j2Qb9ZhSmT/kx0+qiD1mZ1t3ok6L+sDwCFGEx6+xsTXCbMb2BFYw1dvc8natxsfWAOEX3nljwinEfZ0u7GkfXKLw/a3hlhKdLr69hIiIiIiIiIiIKBVEF6ULk9SkIC542bkATinMJjTnJOt6ERXl8NohUlq01cOahDFuI2E1i80jiZsikE46e7w4ELmxfXZNAUyGoccTJgvhkR2tDI8kE8MjRBFun8bCI/lCeCSBzSMNcc0j2g+PAMAJQxxdU9/lwvbIi8cRNYVx/y+JiIiIiIiIiIi0LiQ0GhQkaaFMXGR3cGwNpTBx7FKRAs0j4rVj47VDlHSSlPzXxOGyWmIjdDi2pm/R1hEAmFNbOKxjcGyNchgeIYqIH1uj/qVRnqTwSL0tFh6pKdL+2BoAOHFaLDzy9paWAfd/ce0BefukaWwdISIiIiIiIiKi1NLjCyAkhbeTFh5h8wilCbvCY2vEa9LBkU9ESef2BxGIvCiKTR9aYOXYmgGtP2CXt+eOLhrWMQpzsuQbxXe2dkOSpEScGvVB/RVyIo2Iax7JMvazpzKS1TxS3xUeW1OSm4XcbPU/z8GYUJaHCWW5AIAv9tmw7oDtsPt2e/xY9vl+AIDJoMOFR9Uqco5ERERERERERESJIi5IJ695JHZcGxfAKYXZ4sIjSo+tYfMIUbKJ42DEpg8tyMsyQq8Lb7N5pG91zU55+4hhNo8AsfYRm8uPjh5+700WhkeIIuKaR9J0bI3HH0SL0wMAqEmRkTUAoNPpcMOxE+Q/P/bBrsPu+881B9DtCf8gcf7cGlQWmJN+fkRERERERERERInkEBagrAqMrbFz9AalsPixNckPj8SNrenlYjFRsomNHlobW6PX65AfaUNxegID7J2Z6rvCExGyjXpUj2DNblJ5vry9s7V7xOdFfWN4hCgirnlEY+GRtm5PQo7ZaHfL27UpMrIm6ry5o+QXlfe3taGuyXnIPt5AEH9bvRcAoNMB1x83XtFzJCIiIiIiIiIiSgTx7uVkjeHIz47dLe3g3dKUwuLG1iiwsFyYw5FPREqKC1RqbGwNEGtD4WvpoSRJQoMtvDY5qsgCnU437GNNroiFR3YwPJI0DI8QRYjNI9lG9S+NopwsGCK/vbX3JKZ5JJruA4DaFGoeAYAsox43HCe0j3x0aPvIv9c1oi3S0nLq9EpMKMtT7PyIiIiIiIiIiIgSRVyQTtZd1nq9Tj62nWNrKIXZVGwecbC1hyjpnAq0cY1ENNDidPshSZLKZ6MtXb0+ef21pmhk65LRsTUAsKOtZ0THosNTf4WcSCM8kW9eZpMeev3wk2+JYtDrUJIb/iE0UWNr6m1i80hqhUcA4JL5tSjNC/8/efPrZuxuj704ePxB/HXVHvnPNx4/4ZDHExERERERERERpQKHAuERILYIzrE1lMqi4Se9Dsg3G5P+fGK7iY3BK6KkE8fWWBW4xocq+jodCElxN6oT5NYRAKgZ4USESRUcW6MEhkeIIqLf0LUwsiaq3BoeXdPR40MoNPK04r6OXnl7bEnqhUfMJgO+e0x4FI0kAdc99yW+2t+F+i4XLnjiU+yNfH5LJpRgTm2himdKREREREREREQ0fEqFR6LHdnoCCARDSXseomSyu8Php8KcLEVuDBXbTTi2hij5HEJIqyBJo9xGQhyl43QHVDwT7UlkeKTAYkJFZN10R2sPW16ShOERogi3T4PhkXwzACAYktCRgNE1ceGR0twRH08NVywajdK88IvDnvZeXPjkZzj94Y+xpckJIPzv95PTpqp5ikRERERERERERCOiVHikSFiEc3q44EWpyd4bvl4KFRpnkW82IppRYWsPUfKJr09iUEMrrJZYG4qDgbI4DTaXvD3SsTUAMDnSPuJw+xM2tYHiMTxCFCGHR7K0Ex4ZVRhL4TXY3f3sOTj7OsPhkWyjHpVW84iPp4Z8swkvXb8QR0SaRSQJ6PGGf3AYV5qL/9xytPwxIiIiIiIiIiKiVKT02BqAi+CUmvzBELoj7w8XKtRIoNfr5OvSzrE1REnnFF4TrQqFxIZCfJ0WR+xQYptHgFh4BAi3j1DiMTxCFCGPrdFQeET8Rip+gx2OYEhCfVf4GGNLchWp70uWieX5eO2mJfj5GdOQbQx/GztpWgWWf+9oTKnMH+DRRERERERERERE2hZX0a/A2BqA4zcoNYlBK3GcTLJFg1cMXRElnxjISOZr4nDFj63ha6kovnkkEeGRPHl7R2v3iI9HhzIOvAtR+vMHQwiEwrOxtDS2ZpTwjbRxhOGRJrsbvsjc0jElI6+GUptBr8N1x47HeXNHodHuxhE1BdDpUjcQQ0REREREREREFBXXPJLENgWxqcHBBgVKQWJ4I5nXysGiC9hOTwCBYAhGA+/VJkoW8TVRm2Nr2DxyONEb47ONepTlZY/4eJOE5pGdbQyPJAPDI0SItY4AgFlL4RFhbE2j3dXPngPb29Erb48rzR3RsbSkLD8bZfkjf8EhIiIiIiIiIiLSiuhCmV4H5GUl7238QmHBy8YGBUpBNpc6zSNFOeJicQDFuco9N1GmcboD8rbVor2lbfGcGMSMkSRJDo+MKrIk5AbwSeVi8wjH1iQDo5BEADy+WHhES80jNUWxhpCRjq3Z3xkLj4xNo/AIERERERERERFRuomGR6wWU1LHTxcJC952LnhRCrLHhUeUayQoFIIqDF4RJVe0zcOo12lqDS+qwBIfJqOwrl6ffPO+uN45EvlmE6oLzADCY2skSUrIcSmG4REixDePWLK088JTmpeFbGP4Mh3p2Jq9HbHmkrElDI8QERERERERERFpVTQ8IjaDJIO44GV3MzxCqccWN7ZGufYPceQTg1dEyRV9TSywmBLSXpFo4igdJ19LZeJN8TVFln72HJro6JpuTwCtTm/CjkthDI8Q4aDwiIZSizqdTh5d02h3jyhBty+ueSQxCT8iIiIiIiIiIiJKrFBIku+yLkhyeERsT3CwPYFSkF34ulW0ecQiXDtuXjuZ4INtrfjzuztg6+W/t9KcQhuXFonn5WB4RJas8MjkCnF0TXfCjkthDI8QAXAJY2vMGgqPAOE5YED4HG0jSDDv6wiHR8wmPSryzQk5NyIiIiIiIiIiIkqsbk8A0XvIkr1QJjabjOS9RyK1xI+tUad5xNbLayfd1Xe5cP1zX+Hh93fiir+tQbeH/+ZKCYUkdHvDo2CsZqPKZ9O3uOYRfm3IGmyxiQiJGlsDxJpHAIZHkkGbVxmRwjxCeCRHQ2NrgPg0XqPNjeLcof8AHAiGUB/5Jj22JDepc1KJiIiIiIgovf3mN79BZ2cnAGDs2LG47bbbBvU4j8eDt99+G3V1dXA4HCgvL8eSJUuwaNGiJJ4tEVHqEe9aTnbziLjYzrE1lIrE0FOyrxdR3NgaXjtpb8XmZgRC4VTfliYnbnz+K/zj2wuQZeQ9+snW41MuUDlc4vcepzug4ploS/KaR2LhkZ2tPQk7LoUxPEIE7Y6tASCPrQGARrsLs2oKhnyMJrsH/mD41XVsSW7Czo2IiIiIiIgyy+OPP45f/epX8p8XLlw4qPDIc889hx/+8Ifo6uo65GNHHHEEnnnmGcyZMyeBZ0pElLqUDI/km43Q6QBJ4tgaSk1xY2uGcePlcHHkU2Z5Z0tr3J8/2dWJH7+yEX++eA5v1k0yhxAQ02p4xGzSw2TQwR+U2DwiiG8eSVx4ZFK5MLamjc0jicZIHBEOCo9ornkkVuUkpvSGYm9nr7w9pjRx1VBERERERESUOXbv3o0777wTer0eOt3g3yR/6KGHcPXVV6OrqwsVFRX4wQ9+gPvvvx+XX345srOzsXHjRhx77LFYt25dEs+eiCh1iOERsd0gGfR6nRxQYXsCpaL4sTUKNo9w5FPGaO/24qsDNgBAeX42siNtI8s3NOGBt7apeWoZQQxjiONhtESn08nn5uBrqSy6pplt1KMsLzthx83NNso33u9q7YEUraahhGB4hAiAWxhbY9Za84iQxhtueGRfRyw8Mo7NI0RERERERDREoVAIV199NXp7e/H9738fWVmDu7N306ZNuOOOOwAA8+bNQ11dHR566CHcddddeP755/Hxxx8jLy8P3d3d+Na3vgW/n2+2EhHZ3bEWAyXGcEQXwe1cAKcUZIu0fmQZ9Iq2inPkU+Z4t65VHpty8bxaPHrZkYiWjTy1ag+e/niPeieXAcQxMEqOphqq6Lk5+f0AACBJkrymOarIMqSbDwZjckW4faTbG0Czw5PQY2c6hkeIAHhSZmzNMMMjQvPI2FKGR4iIiIiIiGho/vCHP+CTTz7B+PHj8dvf/nbQj/vVr36FUCgEvV6PF154AcXFxXEfnz9/Pn7zm98AAHbs2IHnnnsuoedNRJSKlBxbAwAFkUVwp8ePYIh371JqiYaeCnNMCV+c7E+B0HJi59iatPb2lhZ5+9QZlTh5egXuO2+W/Hf3/W8rXt/YpMapZQTxNdFqMap4Jv3Lj7xed3sDCPG1FF29PnnqgzhhIVEmV+TL2ztaObomkRgeIYK2x9ZUWM0wRmKsCWkeYXiEiIiIiIiIhmDLli341a9+BZ1Oh6effho5OYN7889ut2PFihUAgFNOOQWTJ0/uc79rr70WFkv4xol//vOfiTlpIqIUpnR4JDrqQ5J4xzSlnmjziNgEogSr2QhD5H17tvakL6fHj093dwAAqgvMmDnKCgC4bOFo3HbSJHm/n732NVy+QJ/HoJFJhbE1QPh7AhB+Le3h10LcemaNMGEhUSYJ4ZGdrT0JP34mY3iECIDbF5K3zSZtXRYGvQ5VhWYAQKPNNaxj7OsMP85iMqA8P3FzxYiIiIiIiCi9+f1+XHXVVfB6vbjuuuuwdOnSQT925cqV8PnCCzonn3zyYffLy8vD4sWLAQCrVq2C1+sd2UkTEaW4+LuslRtbA3D8BqUWjz8IbyD83n5hjrKLyjqdTg53iaOmKL18uK0N/mC4ReKUGZVx7TY/OHESTpleAQDo8QawpcmpyjmmO6fCr4nDJZ6bg4GypIdHomNrAGA7m0cSSlur5EQqEZtHzBobWwPERtc4PYG4lOVgBIIh1HeFwyNjSnIUre4jIiIiIiKi1Pab3/wG69atQ01NDR588MEhPXbz5s3y9syZM/vdd9ascPV3IBDA9u3bh36iRERpRFwoK7Qkv02hUGhs4PgNSiU24etV6fAIEAte2Xu5UJyu3tnSKm+fMqMi7mM6nQ7HTymX//x1g0Ox88okTk+sxUOJNq7hEoOYDgYx0SDcDJ+MsTUTy2PhkZ0MjySUosOhJEnC+vXrsXr1anz11VfYvXs3mpqa0NPTA51Oh7y8PFRXV2P8+PGYN28ejj76aMydO5eL3ZR0Ho2HR8LfWLsAAI02N6xVg3+BbLS7EYjMV+PIGiIiIiIiIhqsL7/8Evfffz8A4K9//SusVuuQHr9v3z55e/To0f3uK3583759mD179qCfp6Ghod+PNzc3D/pYRERaII7AKFBgQbyAzSOUomxCaEPpsTVALLDS7Q3AHwzBZOD92unE4w/io+1tAMLjvRaMLT5kn1mjCuTtzU0MjyRDXPOIWdFl7SEpYHgkTrKbR3KyjKgttqC+y43d7b2QJIl5ggRR5Cr74osv8Oyzz+KVV15Ba2vrYfdra2vDnj17sHr1ajz33HMAgIqKClx44YW46qqrsGDBAiVOlzKQNxALj1g0GB6JNo8A4fDItKrBv2G3p6NX3h7L8AgREREREZFm7d27t98bbcaNG6fYuXg8Hlx11VUIBAK48sorccYZZwz5GN3dsTvA8vLy+tkTyM+PzawWHzcYtbW1QzsxIiKNExedlLjLWmxsYPMIpRJxXEyhKuGR2HM63H6U5nFkfDr5ZFcHen3htaMTp1XA2Ec4aHJlHox6HQIhCVsaObYmGVJlbI34WsrwyMHNI4kPjwDA2JJc1He50eMNwObyozhX+deBdJS08IgkSXjllVfwhz/8AWvXrh32cVpbW/HYY4/hsccew/z58/GjH/0IF110EdNDlFBun7abR0YJ31gb7e5+9jzU9pbYm24Ty/p/s46IiIiIiIiU09LSgn//+99YsWIFVq9eDZvN1u/+xcXFOProo3H66afjm9/8JiorK5N2bj//+c+xdetWVFRU4KGHHhrWMTwej7ydldX/G3nZ2bHFFrd7aL/3EhGlm+iik0GvQ25W8t+rLIobW8MFL0od4terKmNr4oJXDI+km7e3tMjbp87o++fubKMBkyvyUdfsxM62brh9QVgU+L6dSZweZQOVwxXX4sXXUrl5JNuoR1mSvjfWFsfG4RzocjE8kiBJCY+sWLECd911FzZt2hT395WVlVi4cCEWLlyII488EmVlZSgpKUFJSQlCoRC6urrQ1dWFtrY2rFu3DmvWrMGaNWvktpIvvvgCl1xyCX7729/igQcewOmnn56M06cM5PGH5G2zSXvVcjWFww+PbG2OpV2H0lhCREREREREiSdJEt566y08+uijePvt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ocvlwh/+8Ae8+OKL2LFjB0KhELKysrB48WLccMMN+Na3vpXsT4mISLOcGmseiWtPSNO7pSk1aX1sjXhONgavNK3JoVzziE6nQ01RDra3dqPR5kYoJEGvZ4D6cGy9YkgslZtHYkvw6do80uLQbnhEDIU12RnaGgr2nlJGE8fWmI1sHiEiIiIiIiICgMsvvxxfffWV/Ge9Xo/CwkI4HA709PTg448/xscff4yHHnoI//3vf/tti92/fz9OPPFE7N69Wz5WQUEBHA4HVq5ciZUrV+K1117Diy++yBE9RJSRnO6AvG21qP998ODRG0RaofVxFvGtPenZNJAumiOLydlGPYpzk/+1VFtswfbWbviCIbR1e1GZ5MBKKos2j1hMhpSeGFCYAS1erd1eeVtrY2viwiNsHhkSVi1QRouOrcky6pn0JCIiIiIiIoqYOXMmfvrTn2LFihWor6+H1+uFzWaD1+vFV199hcsvvxwAsHv3bpx55plwufqe3+71enHaaadh9+7dMJlM+OMf/4ju7m7Y7XbU19fjsssuAwC88soruP322xX7/IiItES8I9mqgeaRggyo2qfUFDfOQoPhkbjmkd70XCxOF9ExFlUFZkXGKNYU5cjbDba+f26msGhrjxZHUw2F2CSWrs0jrUIoo9yareKZHCpubA2bR4aE4RHKaN5AeGyN2chLgYiIiIiIiCjqmWeewe9+9zucdtppqKmpkRtBTCYTjjzySDz//PO49tprAQB79uzB8uXL+zzOww8/jG3btgEA/vSnP+H2229HTk74zfOamhq88MILOO200wAAjz32GL7++utkf2pERJrj9IQXlfQ6IC9L/eYRccGLozdIS8SvR6tZ/WvlYGLTgI3NI5rl9PjR4w03PlUVWAbYOzFqimLPU8/wyGFJkiS39mixXWgoCjKgxavVGQuPaK15xGwyyK1CzWweGRKumFNG8/jDzSOpXH1FREREREREpIZoawgAbN26tc99HnvsMQBAbW0tbrrppj73+d3vfgcACIVCePLJJxN8lkRE2ueM3JGcbzZpoh05y6hHXnZ4YZ6jN0hLonfvW81GGA3aW94qilss5rWjVS3CQnJVoTIL3nHNI11sQTicbm8AgZAEAIqME0omMYjpTNPmkRYhPFKhsfAIEGsfaXF6EIx8XdHAtPfqSqSgaHjEksXwCBEREREREdFQ+P2xN0ErKysP+fhXX32FAwcOAAAuuOACGAx9/+49d+5cTJo0CQDw2muvJeFMiYi0LbogXqCBkTVR0XNJ16p9Sk3RNo8ijS4qF8U1j/Da0aomYYRFtULNI7XFbB4ZDLsw7qkwxcfWFAqv6fY0fS1tc3rl7coCLYZHwtddMCShvds7wN4UxfAIZTR3tHnEyPAIERERERER0WBJkoSnnnoKAGA2m3H66acfss+XX34pby9atKjf4y1ZsgQA0NLSgqampgSeKRGRtkmSBKcnPD7BatHOGI7oop3d5Yck8W5dUl8wJMlhpkINBa1EVosJukh5EJtHtKtZ7eYRG5tHDkcc91SU4mNrrML3qXQNYkabRwosJk1OeBglXN+Ndl53g6Wdn0aJFCZJEjz+EADAbGKOioiIiIiIiKgv7e3tCAaDkCQJbW1tqKurw+OPP47Vq1cjKysLTzzxBMaNG3fI47Zt2yZvjx8/vt/nEB+/detWVFdXD/r8Ghoa+v14c3PzoI9FRKS0Xl9QrlLXUvNINDwSCEno9QXlMTZEaun2+BHNMRVqdFHZoNehwGKC3eVn84iGNavQPFJgMcFqNsLpCbB5pB/x4RHtvCYOh8kQHgHX4w2kZZhMkiQ5PFJhzVb5bPpWVRi7vpsdbgBF6p1MCuFPfJSxvIGQvK3FRBwRERERERGRFsydOxeNjY1xf2cwGHDDDTfglltuwaxZs/p8XGdnp7xdVlbW73OUl5fL211dXUM6v9ra2iHtT0SkJU7hbmSrWTsLZYUWYfxGr4/hEVKdGMbQ8qJyUU5WJDySfovF6aJJheYRINw+UtfsRJPdg2BIgkGvU+y5U4XdJY6t0WZIbCgKLCb0eANwuANqn0rCOdx++CLrrBVW7Y2sAYAqYZROs93Tz54kYt0CZSxPZGQNwPAIERERERER0eGUl5ejoqICZWVlyMoKv4kbDAbxn//8By+++CL8/r7vrO3p6ZG3LZb+7+oUP97d3Z2AsyYiSg1Oj0bDIznpX7dPqUUMY2h5UTl67XR7AggEQwPsTWoINxCEVSnUPAIA1ZEWhGBIQnu3V7HnTSVdvbHrvDhXu9f5YEUbxRxuX9qNgIu2jgDaDY9UC80jTQ6OrRksxoUpY0VH1gAcW0NERERERER0OOvWrZO3Q6EQNm7ciIcffhjPPvss7r//fqxevRpvv/32IQERnS52N+VAb5aGQrHf0fX6of2OXl9f3+/Hm5ubsWDBgiEdk4hIKQ7hLusCDbUpiOERO8dvkAY44hoJtHOtHKxICLY43H6U5GlznEMmizYQ5GYZYDUrt0wa14LgcKOyQJsL7mqyx4XEtHudD1Y0POIPSnD7g8jJSp9l+VZnLABVqdHwCJtHhid9vkqJhojNI0RERERERERDo9frMXfuXDzzzDMYN24c7rnnHnz88cf43e9+h9/85jdx++bn58vbLlf/s93Fj4uPG4yampoh7U9EpCVOT6zKXslFzIGIY2vsbo7fIPWJzSNFKdA8AoRH7TA8oi2SJMkNBFWFlriwc7KJI3KaHR7MVeyZU0f8eCrtXueDFQ2PAOEgZlqFRxxi84g2v89VWM3Q6QBJYvPIULBugTKWJxALj1gYHiEiIiIiIiIakp///OcoLi4GADz//POHfLyiokLebm5u7vdY4sfLy8sTdIZERNonjoQRF5nUVsDmEdIYWwo2j4gtCqQNdpdfbqWvUrj5I755hC0IfUmVkNhgpfMIuNYUGFtjMuhRkR8+tyY2jwwawyOUsdw+No8QERERERERDZfRaMSsWbMAAPv3748bPQMA06dPl7d37tzZ77F27dolb8+YMSOBZ0lEpG1OYTHJqqHwCBfASWscceMstLuoXHRQ8whpi9g+UF1g6WfPxKsSnq+FLQh9EsMjhbnaeU0croObR9JJixAe0fIIpmjjT0ePF16hVIAOj+ERyljRdCkAZJt4KRARERERERENldsdfuPbYrFAr4//3Xrx4sXy9urVqw97DEmS8PHHHwMAJk+eLLeZEBFlAodGwyOFbB4hjYkfZ6Gda+VgBUKwxcbgleY0C+0D4hgZJYjNI01sHumTrTd8nRv1OuRnp/6IlwI2j6hODIm1Orwqnknq4Io5ZSyOrSEiIiIiIiIavvb2dmzYsAEAMHv27EM+PnnyZLmZ5NVXX4XL5erzOO+99548tubCCy9MzskSEWmU0yOER8zaWRAvFO+WTrMFL0pNqTLOoigueMXwiNY0q9g8Ii6wtzA80qfoNVOYkwWdTqfy2Yyc2DzicKfX94NWZziIodcBpXnZKp/N4cWHttj4MxgMj1DG8nBsDREREREREdEhgsGB63y9Xi+uueYa+HzhN0G/853v9LnfnXfeCQCw2+34+c9/fsjH3W43fvSjHwEAcnJycMsttwz3tImIUpLTHZC3Cyzaucu6gM0jpDHiXfsFGm4eKYprHuG1ozVi44fSzSNmkwElueGvj2Y7F7H7Er1mtNwuNBSFltj3g3RrHomOrSnLz4ZBr92gT1VhLCTWxOtuULTz0yiRwsTmEbOROSoiIiIiIiIiAHj66afx+OOP46yzzsLChQtRXl6O8vJyGI1GNDc345NPPsETTzyBXbt2AQBOPfVUXHvttX0e6/LLL8eyZcvwzjvv4KGHHkJnZyduvvlmVFZWYvPmzbjnnnuwadMmAMD999+P6upqxT5PIiIt0OzYGmHBi+0JpAXR5hGtj7MoZPOIpomhjSqFm0cAoLLAjM5eH1q7vQiGJE0vuivN4w/C7Q+v22m5XWgoxOaRdApiBoIhdPSEm0cqNTyyBgBGCSGxZjb+DIp2X2GJkszjD8nbbB4hIiIiIiIiCjMajdi0aZMc6jgcvV6Pm2++GQ8++CD0+r5vytDpdHj11Vdx8cUXY8WKFVi2bBmWLVt2yPPdfffd+P73v5+wz4GIKFVodWxNllGP3CwDen1Bjq0hTbD1hr8OC3NMmh5nEdc80strR2vE5pFqhZtHgHBgZUuTE8GQhPZuLyoLtL3wriRxNFVhujSPCJ9HOjURtfd4IUnh7XKNh0fEkBibRwaH4RHKWB5/rHnEksXwCBEREREREREAfPe738U3vvENvPvuu/jkk09QX1+PlpYW+Hw+WK1WTJw4EYsWLcKll16KMWPGDHi8vLw8vPnmm3j99dfxz3/+E3V1dXA4HCgvL8eSJUtw7bXXYtasWQp8ZkRE2uOMBDOyjXrN3eBWmJOFXp87re6WptQVbekp0FBDT1/ix9aweURrmh3hxeMCiwk5WcovkVYViC0IboZHBGLYqjg3PZpHSvJin0dXr1fFM0msVmfsc9F680gVm0eGjOERylhuITySbdTWL2ZEREREREREapo8eTImT56MW265JWHHPOecc3DOOeck7HhEROkgGh7R0siaqAKLCY12NxxuHyRJ0nTbA6U3XyCEHm8AgPbHWViyDMg26uENhOLGUpH6QiEJLZHF4yqVQhsHL2TPVeUstMke1zyi7et8sMQQTFdv+oTJWoQQhtYDUKW52TAZdPAHJTaPDFLfnaJEGSB+bA0vBSIiIiIiIiIiIlKWltsUonX7/qAEly84wN5EyWN3p9aicjTgwuYRbeno9cIfDM/aqC60DLB3csQ3j7AFQSSOdSlKk7E12UYD8rPDPQ6dPenz/aCtO/a1W56freKZDEyv18kBF4ZHBocr5pSxvOLYGo1VQhIREREREREREVF6CwRD6I2EMqxm7ZWEFwqLd1wEJzU5hEXlwhRYVI6eo83lhyRJKp8NRTXbYwveajWPVFpjoZUWBxeyRV3C64zWG4aGIjq6pqMnfcbWpFLzCABUFYSvO6cngN5IixUdHsMjlLHEsTVamydKRERERERERERE6a3bE1vA0OLYGrHhwe7i+A1ST6o1EkQXvn2BUNw6BKmrWQhrqNU8Ui2MrWli80gcuzDWpSg3fcIj0dE1Tk8AvkBogL1TQ4sz9rVbYdV+eGSUcL03M7Q1IIZHKGN5GB4hIiIiIiIiIiIilURH1gAaHVsjnJN4rkRKE5tvUmJsTa7Y2sNrRyuaNNA8Ii60tzA8EifVQmKDVZIXG+uSLi1ebc5Yi0oqhEfE6138PkB9Y3iEMpbHH0v4mU28FIiIiIiIiIiIiEg5Tk9socxq1t5CmTgehM0jpKZUG1tTYIkFXGy96bFYnA7ExoHoGAulmU0GlESaKJrtbEAQ2VMsJDZYpXmxzyVdRtdEm0fMJr0mx+4drIrNI0PCFXPKWGLziIXNI0RERERERERERKQg7TePCGNr3FwAJ/WId+sXpcCichGDV5okjokRx8corTLSgtDa7UUwJKl2HlrTFXeda+81cbiKhRE8XWkSJmuNhEcqrWbodDqVz2Zg1ULzSCObRwbE8AhlLHHWYDbDI0RERERERERERKQgpzsgb1st2rtzt4AL4KQRthRrHhEDLukypiIdiE0fao7aiLaeBEMS2rvTo4kiEcTrXIuByuEqyY2NrensSf3vBy5fAN2e8M8vqTCyBohvGmLjz8AYHqGM5eXYGiIiIiIiIiIiIlKJOLZGiwtl4gK4nQvgpCJ7ijWPxI984rWjFc2R5pGS3CyYVbyhuEpoQeAIjZjotVJgMcFoSJ81u5I0G1vT6ox9DqkSHhGbhpodbB4ZSPpcfURD5AmEm0f0OiArjV6IiIiIiIiIiIiISPvEsTVWs/bCI4VsHiGNsKd08wivHS0IBEPyqI0qFUfWALGxNQAXskW2yEiXdBpZA8Q3j6TD2JoW4WtW/FrWsgKLCTlZ4cBYEwNbA+KKOWUsty8cHjGbDCkxk4uIiIiIiIiIiIjSh1MMj2iweaRQOCe7mwvgpB5bijWPFOXGrh2OrdGGtm4vQlJ4WxxhoQa2IBwqEAzBGRmFUpgC1/hQiM0j6TC2JhrCAoDy/Ox+9tQOnU6HykhLSpsz9dtfko3hEcpY0eYRNevJiIiIiIiIiIiIKDOJzSNaHFtTINz97WB7Aqko2jxiNulT4v18cfGb1442iONhqlVuS6i0xsIrLWxBABAfUEy75hExPNKb+sEFMTySKs0jAFBuDQdderwB9HoDKp+NtjE8QhnL4w8BAMxGXgZERERERERERESkrOhd1oA2x9ZkGw1yzTvbE0hNdnf466/QkhqNBPFja3jtaEGTPbbgXVWoneaRJjaPAADsKdYuNBTi59OZDmNrhPBIhTWFwiP5sXNt6079EE8ycdWcMpbHH2keydJ+UpmIiIiIiIiIiIjSi9abR4DY6BqOrSG1SJIEW6S9ozBFGgkKLCbodOFtG5tHNEFsHqlSuS1BXHBvYXgEQPx1UpSbXuERk0Evf+9Kh7E14tiXyhQKj1RYYyN2xPYUOhTDI5Sx5PCIkeERIiIiIiIiIiIiUpZTCGTkmY0qnsnhFUTumHa4/JAkSeWzoUzk9gfhC4RbxFOlkcCg18ltQnY2j2iC2DxSrXLziNlkQEkkINFs59gaALD1is0jqRESG4rov3dnT+o3XojNI+VCIEPrxNAWwyP9Y3iEMlIwJMEfDP+yYzbxMiAiIiIiIiIiIiJlOT3h8Ei+2QiDXqfy2fQt2jziC4bgjtyMR6Qku9BIkCrNI0BsAZzNI9qgpeYRAKiMnENrtxfBEIN54ninwhQJiQ1FSW44ZNHrC8o3tqeqaPCiKMeE7BS6Ob9cCI+I7Sl0KK6aU0YSvzlbOLaGiIiIiIiIiIiIFBZtHok2FGiRuFjPRXBSQ6ouKkdbe5weP8MBGtAcGQ+j08U3EKilqiDcfhIMSWjv5kJ23NiaFLrOB6skL/Y5dfambhuRJEly8EIL19FQVORzbM1gMTxCGUlMyXNsDRERERERERERESlJkiQ43QEAQIFFy+GR2IIXx2+QGuxxi8ravVYOFj3X/5+9+46Tq673P/6esrOzvfdNr5ACgQAhNAEVUIrYQKVZUFS8tsu1/FQQvV69yrVw7xULAqKAV0RQiiBKS+glQEgjZZNstmV7ndkp5/fH7Jw5S3Y3u8m0M/N6Ph4+PJs9M/PdTMky3/e8P4Yh9Y0QvEq16Nia6qJc5bhSvzVqbT+xtqJkK2tIzE7P8+kaFx6x8eianuGARkORMWK2C49Yx9YQ2JpS6l8hgRSwNo94cwiPAAAAAAAAAEgeXyBsbsAU57lTvJrJWZtH+mgeQQrYd2xNbLO4h+BVSvmDIXWObdhHGz9SrXZceIQWhN4hS0isIPOaR8oLYq0Xdm4eabM8VmttFh6pLo7dBx00j0yJ8Aiyki8QNo9zc3gaAAAAAAAAAEiefl9soyytx9ZYWlF6aU9ACth1bI016EJrT2pFx2xIUn1pemx4W9dBeOStzSP2eZ5PV+W45hH7vh5Yx73UWMIYdpDvcasoNxLW7aB5ZErsmiMrWZtH8mgeAQAAAAAAAJBE1jEW6T22xroBTngEyddr003lcc0jQzx3UqmlNzYWJm2aR4pj62jtZWzN+JBY+v6beKgqrM0jNh5bMy48UpIeQayZiLaPtPf7ZBhGileTvgiPICsxtgYAAAAAAABAqvRbwiPFaRweKclj9AZSy75ja2jtSRfWZo+6NNnwHtc8wggNdY61cRR4XBm5Z1duGcXTbeexNf32HVsjSTVjax4eDWnQH0zxatIX4RFkJevYGi9jawAAAAAAAAAkkXVsTTo3j1g3wPvYAEcK9FjCI2U2Co9YR+wwtia1WvpizR71penRPFJj2Xhvy/KxNYZhmH8HtWkS7ok369iaTluPrYm1ptTYODwijf9ZMB675shKjK0BAAAAAAAAkCrWIEax153ClUyNDXCkWu+4cRY2HVvDcyelWnvTr3nEm+NSxVgbRbaPren3BTUytmeXqeGRikLL2Joh+4YWxo2tsWF4JDq2RpI6aPyZFOERZCVfkLE1AAAAAAAAAFKjfyRWl16Sxm0K1jEh1vEhQLJYR76UpnFLz1tZnzs9PHdSqjUNm0ekWFCifcCvUNhI8WpSx+6BhOkozcuR0xE5tvPYmuh95XY6zPCTndQUxR5fHQP2DfEkGuERZKWR0Vh4JJfwCAAAAAAAAIAkGt88kr4b4taROr2MrUEKRFs7inLdcrvss6VVVkBrT7po6Y1teFdaGiBSLdqCEgob2p/FG9mtlrE9tRkaHnE6HSofe03osvXYmsh9VV2UK2c0DWMj1uaRdppHJmWff2mBOPIFw+ax183TAAAAAAAAAEDy9FvDI2ncpuDNccmbE3n/lA1wpEK08aa0IH2fJxMpszaPDBG8SqVo80hNsVeuNNrwriuJtaBY21GyTbs1PJKhY2skqaIgElzoHPTLMOzXNDMaDKtzLPhSbdOQj7XZpr0/ewNbB8OuObKSPxBrHsnz0DwCAAAAAAAAIHn6fbHN5JI0Do9IUll+5NPSjK1BsoXDhhlaij4O7SIvxyXP2AdXewhepczIaMgcG1Rfml4b3taghLV9I9u0ZcHYGklm84g/GNawZTqCXewfjIUt7NoQYx1b0z6Qvc+5gyE8gqxkHVvjdRMeAQAAAAAAAJA8dhlbI8XCLb0jAVt+Whr2NeAPKjz2kEv3kNVbORwOlUafOwSvUsba6GFt+kgH1jAL4ZGIukxuHimMBeDsOLqmLQMaYqxjazoYWzMpwiPISr6gJTySQ3gEAAAAAAAAQPL0jwTN43TfFC8dG78xGgzLFwgf5GwgfqyjkuzWPCLF1kzzSOpYQxl16dY8UmwZW9PL2BrJvo0W01FZGAsudA7Zb2SKNWxhDWHYiTfHZf7OxdiayREeQVay/kdOdGYnAAAAAAAAACRDtHkkx+VI+/cnS/Nim/a9I2yCI3l6LI0dZfnpHbKaSDR45Q+Gx7WhI3laLKGM+nRuHsniFoRo84jL6VBFoT1DCdMRHVsj2bR5pD8zQj41Y8GXjgEfbWqTSO/fSoEE8QVoHgEAAAAAAACQGv2+yKZ4SV6OHA5HilcztbKC2KZ9zxDjN5A81uaREhs3j0i0j6TKuOaRNBu1UWPZgG/L5rE1Yz97dVGuXM70/vfwcFjH1nTbsHnE2tRRY+PwSHVRZO2+QFj9vuBBzs5OhEeQlUYIjwAAAAAAAABIkWjzSJE3/dsUSmgeQYr02rx5xBq8sv4sSJ7WPkvzSGl6NY94c1xmG0W2jq3xB0PqGor8u2LnQMJ0VBRYxtbYsHmk3dI8Yuf7yjpypyOLG3+mQngEWcnP2BoAAAAAAAAAKRAMhTUw9mlXO2yIl1rW2McGOJLI2tZRZsPmkVLLmntpHkmJlt70bR6RYmtqH/ArFM6+ERodljYLO49CmQ5r84gdx9aMD4/Yd7yQNfhibVNBDLvmyErWsTV5NI8AAAAAAAAASJLeEWubQvpviJfmWdoTRgiPIHmsbR0lNghavZU1HNZD8Colos0juW6n2fKRTqLhkVDY0P6B7NvItgYSatMw3BNPFQX2HlvTNnZfFXhctmhNm0xNUSz40k7zyIQIjyArMbYGAAAAAAAAQCr0DFnaFNJwM/OtSsdtgNvv09Kwr94Mah7huZMarWPNI3UlXjkcjhSv5kB1JbFROtYRO9miLZvCI4Wx0ELXkP1eD9r7IvdVjc3vp3HNIwOERyZCeARZyUd4BAAAAAAAAEAKWBsI7DC2xrpp32PDDS/Yl92eK29VxtialBrwBTTgj4wIs4Y00ok1MNHal30b2W2WnznTx9YUe93KcUUCTJ02G1sz6A9qaDSyr1pTZO/7qdryOOtgbM2ECI8gK/kCYUlSjsshlzP90qYAAAAAAAAAMlO3zZpHKgpja7Tjp6VhX9YxSaU2bB7JpLE1PUOjCoWNVC9jRqxhjLrS9Nzwrresq6U3+5pHrGNDajI8POJwOMzRSXYbWzMu5GPz5pFqy9iaDppHJkR4BFnJF4wk5GgdAQAAAAAAAJBMPTYbxVFRYKnat9mnpWFv0bYOp0MqynWneDUzlylja/7vhb1a9Z2/66yfPKmmzqFUL2farGGM+jRtHrE2orT0Zt9GdmsGhRKmI/rvadfgqAzDPmGsDkvIp7o4d4oz0591/e00j0yI8Aiykm+U8AgAAAAAAACA5LNbeKQkL8dsb+6y2aelYW/R50ppvkdOGzaIl1qaR3pt2jwy6A/qew9tliRt7xjUhf+7Xi/t7k7xqqbHDs0jDaWx8Mi+3uEUriQ1rM0jmT62Roo1eQXDhvpHgilezfS1ZdD9lOt2ma1Q1scfYgiPICv5gpGxNd4cngIAAAAAAAAAkqfHOrbGsrmcrpzOWNU+zSNIpt6hSOCiNC/9nycTsa7brs0jtz3dNC740jMc0Id+9Zweer01hauanlYbNI/UlngVzUVlY/NINJRQkpejPE/mf9i7osA6Bs4+YUxrQ0cmjBeK/gwd/X5bNcAkCzvnyEq+QKR5JI/mEQAAAAAAAABJ1GPZiC0vSP/mESm24WW3qn3Ylz8Y0oA/8sn86Kf17cbtcqrIGxm3Y8fmkX5fQL98cqekyOigY+eUSZJGg2F95o6X9eundqb160GLDZpHclxOs8lhnyXskg0MwzBDCXZvs5iuikLLGLgh+wTKrA0dmRAeqR77GUZDYVu+Nica4RFkHcMwNBJgbA0AAAAAAACA5BvXPGKT8Ejl2IbXaCisQb99qvZhX92W50lFQe4UZ6a36GgqOzaP3LKuSX0jkY3VC1c16s4r1+h9xzRKkgxD+u4Dm3XdX95QKJyeAZLWvlgYoy5Nm0ckqX5sdE330KiGR7Pn9bVnOKDRsSkBNSX2DyRMhzUw2jVon+aRNksQqzYD7quaoti/Ke0D2df4czCER5B1RkNhRcOwXjfhEQAAAAAAAADJY91Etss4jvEbXvbbBIf9WB9ndm0ekWIBsb6RgIKhcIpXM319wwH9el2kdcTldOhfzlwoj9upH31gpb7w9kXmebc9s1u3P9OUolVOrXVsDEyBx6XisQaYdNRQFgu2tGRR+8i4QEKxfQNiM1FZaB1bY59/S60Bi6pC+99X1ZbHW0e/fUI8yUJ4BFnHF4j9gpabw1MAAAAAAAAAQPJEx9YUe91yu+zx/mTFuA0vNlqQeJ2WT+VX2HizMrrRahjj21TS3c3rdmrAF2nBeP8xjZpTUSBJcjgc+sLbF+uH719pnnvvhpaUrHEqhmGoZax5pLbEK4fDkeIVTa6hNBYeae7JnvCIdRRK1oytsbQo2SmI2T4W9Kks9MjjtsfvLVOxjt6xPg4RYf97GJgh/9jIGknKY2wNAAAAAAAAgCSKbiDbZWSNFBtbI0mdNtrwgn2NH1tjn+fKW1UVxda+3yZjKnqHR/Wb9U2SJLfToavPWHjAOR9YPUtLaookSa8296bdCI7e4YD5QeL60vQdWSONbx7Zl0XNI62W5pGsGVtTaL+xNeGwoY6ByFqrizLjfrL+HNGfDTGER5B1RizhES/hEQAAAAAAAABJEgyF1e+LNI+U5dtnQ7yCsTVIskwZW2Md8bDfJpuUv3pqpwb9kdaRD6yepVnl+ROed/rSakmRVpXHt+5P2vqmI9o6Ikl1aR5MsDaPZNXYGkvjQ7rfR/FSaW0esUkTUeeQX8GwISnS4pMJaixja2geOVD6DvkCEsQ6tsbL2BoAAAAAACbU29ur9evXa8eOHWpra1NPT4+Ki4u1ZMkSnXnmmZozZ86Mrq+/v19//etftWnTJvX19am6ulpr167V6aefLpeLD3cAyA59IwEZkT0YleXnpHYxM2AdG2KXT0vD3jot45Gsox7spqrIXuGR7qFR3TLWOpLjmrh1JOrMI6p10xM7JEn/3NKh9x3bmIwlTktrrzWYkN7NI43W5pFsGltjbR7JlrE1hfYLYlpHKVkfq3bG2JqpER5B1vExtgYAAAAAgEmtW7dOV199tV5//XWFw+EJz3E6nbrwwgv1s5/9TPX19Qe9zv/93//VV77yFQ0ODh7wvcWLF+vWW2/ViSeeeNhrB4B01zMcMI/tNLZm3IaXTT4tDXuzbqxW2rh5xG4jn37x5A4Nj0b2UC46bta4Voy3WjWrVCV5OeobCejJbfsVCIWV40qPD+y2WppH6kvTO5hgHauTTWNrrM0jtVkSHsn3uJTrdsofDKtrKP3DZFJmhkesob72fnvcD8lEeARZh7E1AAAAAABMrqmpSa+++qokqbi4WGeccYZWr16t8vJytbW16d5779Vrr72mP/3pT3r++ef11FNPTdlC8u///u/6xje+IUmaPXu2Lr30UtXW1mrjxo363e9+p23btunMM8/UP/7xDwIkADJez3Bs89i2Y2sIjyAJrA031uYbu7FT88igP6jfPr1bkuRxOfXZ0ydvHZEkt8upty2p0n0bWjTgD+qFpm6tXVCZjKUeVEuffZpH8j1uleXnqGc4kF3NI2PhEY/LqXIbhSkPh8PhUGVhrvb1jqjbJv+WNvcMm8eNZROPsLKbHJdTFQUedQ2Npv3rcioQHkHWsTaP5BIeAQAAAADgALNmzdLXv/51XXrppSooKBj3veuuu07f+ta39N3vfld79+7VJz/5ST388MMTXs9LL72kb37zm5Kkk046SQ899JCKiorM73/2s5/VKaecor6+Pn3kIx/R5s2blZtr3w0iADiYHstmkZ02yxhbg2SLhpScDqk0zz4jnt5qfPNIej93XmzqNj98e+GqhmmFLs5YWq37NrRIkh7b0pE24ZHWXvs0j0hSQ1meeoYDauv3pVWDSyJFm0eqi3PlcDhSvJrkqSj0mOGRUNiQy5neP3smNo9IUnWxV11Do+oY8CkcNuRM8/shmTL/1Qd4C18gVrnrzeEpAAAAAACA1RlnnKFt27bpqquuOiA4IkU+Mfed73xHa9eulSQ98sgjampqmvC6vvWtb8kwDLlcLt1+++3jgiOStGLFCv3Hf/yHJGnXrl265ZZb4vvDAECasWvzSMFY1b40fpwIkCjRx1l5gcfWm3p2ah55sanHPD550fRCIKctrlL07vnHlo5ELOuQ2Kl5RJI5HihsSG2WtWcqXyCk3rExbtkysiYqGhwNG1LvcPr/ezo+PJIZzSOSVFMceW0OhIxxv5uB8AiykD8Yax7Jo3kEAAAAAIBx6uvr5fUe/E3cd73rXebx66+/fsD3u7u79cgjj0iSzjnnHM2bN2/C67n88svNkMqdd955KEsGANvoGdssk6SyfPu0KUSr9iWpayi9N8Bhf4ZhmI+zigJ7N5IV5LqV74nsQ+xP8+aRF5q6zePVc8umdZnSfI+OnRM5d+f+ITV1DiVkbTPV2hfZ8C72ulWQm/5DGBpKY5vyLb2ZP7rGGpCpLcmu8Ij1Nc0Oo2uiY2vyPS5b/d5yMDVFscdde396vzYnG+ERZJ2R0Vh4xEt4BAAAAACAQ2IYhnkcCoUO+P4TTzyhYDAoSTrzzDMnvZ78/HyzxWT9+vXy+TL/05YAspd1bE2ZjcbWSJGqfSmy2RUOGwc5Gzh0w6Mhs0E8+rizs2jwKp3H1owGw9qwt1dSZDTFTNo6zlhaYx7/Mw3aR8Jhwwwn1Jemf+uIFBlbE7UvG8Ij/ZbwSJY1j1RaXtM607zJyzAM7RtrHmksy8uo8ULR5hFJah/gvz+tCI8g6/gC1vAITwEAAAAAAA7F448/bh4vWbLkgO9v3LjRPF6+fPmU1xX9figU0pYtW+KzQABIQ9ZPGdtpbI0kVVir9kcCBzkbOHTW0UgVhfZuHpFio2t6hwMaDYZTvJqJbWzpk39sbcfPLZ/RZc9YWm0eP7Y19eGRziG/AqFIwK3OJq0WDZaQy76ezA+PtPdnb/NIuSU4mu5NXvsH/ebrQiaNrJGkaktoqaOf8IhV+nc1AXHms/xyxtgaAAAAAABmbt26dfrnP/8pSVq5cqWOOOKIA87ZvXu3eTxr1qwpr8/6/d27d+voo4+e9lqam5un/H5ra+u0rwsAEm3c2JoCe9W/l1uq9rsG/eM2wIB46rRsqFZkwOPM2jTQNeSfUatHsrw4bmTNzMIji2sK1VCap329I3p2Z5cG/UEVpnBUjHUkSp1Nmkcas615xHIf1WRZ84g1EJfuY2uaLUEm62M0E1QXWZpHGFszDuERZB3r2JpcwiMAAAAAAMxId3e3rrjiChmGIYfDoRtuuGHC8wYGBszjwsLCKa/T+n3r5abjYMEUAEgnPcOxjaLSPHttir+1an9RzRQnA4eh29o8kgHhkSrLJuX+gfQMjzy/q8c8Pm5u2Ywu63A4dMbSat3+7G4FQobWvdmps5fXxnuJ09bSGwsm1Nuk1cI6XicrwiNZ3DxSYaOxNZkcHrGGljoYWzMOMzuQdXxBy9gaN+ERAAAAAACma3R0VO9///u1Y8cOSdI111yjt7/97ROe6/PF3oTLyZn60/W5ubFNFevlACDTRMMjRbluedz2enu+otA+VfuwN+vjKyPG1hTGNin3D6TfcyccNvTS7kjzSGl+jhZUTR36nYh1dM0/t7THbW2HorUvtuGdjkGdiZTl55hN+Vk3tibbmkesY2sG0+/1wKq5Z9g8zrSxNdbwCM0j49E8gqzjD8TG1nhz7PUfaAAAAAAApEowGNSHPvQhPfbYY5Kk973vffre97436fkFBQXmsd8/9RtyIyOxN8mtl5uOvXv3Tvn91tZWHX/88TO6TgBIlJ6xivoyG7YpVIwbW5Pen5aGvVk/jW8NLdlVZZG1aSD9Nil3dg6aI7VWzymT0+mY8XWcuKBC3hynfIGwHtu6X+GwcUjXEw+t48bW2COY4HA41FCWp+0dg9rXO2I2/GUq69ia6mL7B8RmgrE16aGy0COHQzIMqaOfDy9YER5B1vEFYs0jeR6aRwAAAAAAOJhQKKRLLrlE99xzjyTpvPPO05133imXa/L/ri4uLjaPe3t7pxwv09fXN+HlpqOxsXFG5wNAqoTChvpGIhu0ZflTNzKlo/HNI+m94QV7s4aTKjMgPFJVOH5sTbp5oSk2smb13PJDug5vjksnLajUP7Z0aP+AX2+09GtFY0m8ljgjLZaxL/U2aR6RpIbSSHjEHwyra2hUlRnQujOZaHikosCj3CybEDC+eSS9/y0dHx7JrOYRt8upysJc7R/w0zzyFtQuIOuMBBhbAwAAAADAdIVCIV122WX6wx/+IEl617vepbvvvvugo2gWLlxoHu/Zs2fKc3fv3j3h5QAgk/SPBBQ2Isd2bB6xbmSme9U+7G3c2JoC+2+gVxale3ik2zw+bm7ZIV/PGUfERtf8I4Wja6zNI7Ul9mgekaQGS7NDJo+uCYcNdYw9D2qybGSNFAlaFYx9sL0zzUfARcfW5Htctgy9HkzNWOvN/kG/QtFf0EB4BNnH2jzizSE8AgAAAADAZMLhsC6//HLdcccdkiLBkXvuuUcez8E3PVeuXGkev/zyy1Oe+9JLL0mS8vLyCI8AyFjdw7FPGJfl2y88Um6jT0vD3roybGyNtXmkMw2fOy+ONY943E4tbzj0tpDTl8TCI49t6TjsdR2q1rHmkYoCj632gBpKLeGR3swNj3QO+RUc26i3U7gnnqKja9J5bI1hGGaIqbEsLyPHKFUXRR5/obAxLrSY7QiPIOv4AmHzOM9GvzgAAAAAAJBM4XBYV1xxhX7/+99LigVHcnOn9wngU089VYWFhZKkBx98cNLz2tvbzfDIWWedNeUoHACws95MCo+wyYIEio5F8ricKsx1p3g1h68qjZtH2vt92tMdaRc4urH0sEaI1JfmaWltkSTp1eY+9Q0H4rLGmQiEwmof+zuuK7VXMGFceCSDm0fa+2LPgWxsHpFiobje4YACofBBzk6N/YN++YORtWXayJqoaPOIJHUwusZEeARZxzq2JjeHpwAAAAAAAG8VDof1sY99TLfffrsk6d3vfveMgiOS5PV6ddFFF0mSnn32Wa1bt27C83784x8rGAxKki6//PLDXDkApK/uodhGqh3r3705LhWNbeTTPIJEio5Fqij0ZMSn3a3Pnc40G/kUbR2RpNWHMbImas38CvP4tX29h319M9XcM2KOn5hTXpD02z8c48bWZHDzSFu/ZaxQloZHaopiP3ebZcxSOmm2BJgaLY/NTFJtuR/a+9PzfkgFds6Rdfxj4RGHQ8p18xQAAAAAAMDKMAxdeeWVuu222yRJ55577oyDI1HXXXed8vMjn1T7yEc+ok2bNo37/p133qkf/ehHkqSTTjpJ73nPew5v8QCQxnqszSMF9msekWKflu5K46p92Fs4bJijHDJhZE1UtH0k3ZpHXmjqNo+Pm1t+2Nd31KzY2JtX9/Ye9vXNVFPXkHk8t9JebQnZMrbGGh6py9KxNfU2uK+zIjxSnL6tUKlk/74vYIaiY2ty3c6MSC0DAAAAABBP//M//6Pf/OY3kiSXy6WysjJ95jOfmfIy73vf+3TOOecc8OeNjY266667dOGFF2rPnj1auXKl3va2t6m2tlYbN27Uq6++KkmaPXu2/vCHP8T/hwGANNIzZO+xNZJUUZirpq5h9Y0ENBoMy8OH8xBn/b6AgmPNERUFMw+upqvKwlzt7BzSgD8oXyAkb056jOl7cXckPOJwSMfMOfzmkaMaS83jDXv7Dvv6ZqqpMxYemVNhr+aRmmKv3E6HgmEjo8fWtPXFfraaLA2PjGuZSdP7urln2DzO1LE11uaRDsIjJsIjyDq+YKR5JC9NfjkDAAAAACCddHZ2msehUMgcXTOVhQsXThgekaTzzjtP69ev1+c+9zm98MIL+sc//mF+LycnRx/4wAf04x//WNXV1Ye/eABIYz3DlrE1BfYbWyNJFZbGlJ7hUdVk6cgBJE6nZSRSJjaPSJFPuM8qT/1m7KA/qE0t/ZKkJTVFKsk7/NeluRUFKva61e8LasPeXhmGkdQP8VrDI/Mq7RUecTkdqi3xqrlnJG3bKOKhrS+2SZ+tY2usLTMtaXpfZ0PzyFtflxFBeARZZ2Q0Eh5Jl2QvAAAAAADp5Pzzz1djY+OMLnP88cdP+f0TTjhBzz//vLZv365Nmzapr69P1dXVOu6441RefvgV6QBgB9bmkXKbj62RpM5BP+ERxF3XYGwDr7Iwc5pHxm1SDqZHeOSVPT0aK3mJy8gaSXI6HTpqVqmeerNTnYN+tfT5xm2UJ1pTV6wtYU5F6v+OZ6qhNE/NPSPqGwlo0B9UYW7mbeO2W8bWZGt4xBrGSNeg0PjwiP2eS9NRbXld7hjwTXFmdsm8Vx3gIHwBwiMAAAAAAEzmmGOO0THHHJOQ6164cKEWLlyYkOsGgHTXPZwBY2ssY0S6LA0RQLx0Z0DIaiKVluBVunzC/YWmHvN49dzDH1kTdfRYeESSXt3bm+TwSKR5pMDjUpUNw0cNZXnSrsjxvp4RLaktSu2CEqBtLDzizXGqOC87t6mtz4n0DY9Eglj5HpfK8u3ZlnYw1oAiY2tiGEiIrOMLhiURHgEAAAAAAACQPL2W8EipTTdirM0jXUNstCD+Oi3hkYoMCo9Ym0c6B9PjufNiU7d5HK/mEUk6qrHUPH51b2/crvdgAqGw2ZYwt7IgqeNy4sUO40wOV3tfJDxSW+y15X0UD6X5Ocob26Pc15N+97NhGOa6GsvyMvZ+8ridZjAmXUJ96YDwCLJKKGxo1AyP8PAHAAAAAAAAkBzRRoUCj0u5bnt+sK2ikOYRJFamjq2x/izpsEkZCIX1yp5eSZHAQn0c20GOmlVqHr+SxPBIc8+IQmNzeOZWFCTtduPJGh5pzsDwyJA/qAF/UJJUW5KdI2skyeFwRFpmFGkeMQwjxSsab/+gX/6xvdRMHVkTVV0UeRx2DPjT7n5IFXbPkVX8wZB57LXpf6ABAAAAAAAAsJ/e4YAkqczGbQqVBdbmEcIjiD9rKMnadGN36dY88kZLv0YCkf2SeI6skSI/azQE8Xpzn4KhcFyvfzLRkTWSNLfSnhve0UCBlJ6NFIcrOrJGijSPZLPoc8QfDKfdv6fNlsdeY1nyxk6lQvS1eTQYVr8vmOLVpAfCI8gqvkDslxSaRwAAAAAAAAAkQzhsqGdsbE1Zvn03xMutY2vSYAMcmcc6Dqkig5pHrOGRdGgesY6sWR3HkTVRR4+1j4wEQtq+fzDu1z+Rps5YeGROBjSP7MvA5hFrIKYmi5tHpPQOCmVTeKR63Guzb4ozswe758gqvkCseSTPQ/MIAAAAAAAAgMQb8AU1Nk3B1s0jFQWMrUFidVqbR2z8XHkr63MnHcIjrzb3mcfHzo5v84gkHTWrJHZbSRpdYw2PzKu0Z3jEOj5oX89wCleSGFva+s3jhVWFKVxJ6qVzUKjZ8tjL9LE1VcWx1+aO/tS/NqcDwiPIKiMBxtYAAAAAAAAASK7u4diGeHl+TgpXcnjK8nPkcESOO9OsZh+ZoXvscVXgccmbkznv4XvcTpWOPfc70yB4taklEh7xuJxaVBP/TfyjGkvN4w17+yY/MY6aumIb3nMq7Lnh7c1xqXKscSfdAgXxsLl1wDw+oq44hStJvXHhEZpHUqbK0nC1n0Y1SZI71QvIZn/84x/V1dUlSaqpqdGFF1447ctu3bpVmzZtUl9fn6qrq3X88cersrIyUUvNGNbmkdwM+sUTAAAAAAAAQPrqsYRHSm08tsbtcqos36PuoVF1D7HJgviLjkPKpJE1UZWFueodDmj/gF+GYcgRTWIl2choSLvGWjoW1xYqxxX/z5mvaCyR0yGFDWlDsppHuiI/U4HHNW5D2G4aSr3qHPSrY8Cv0WBYHnfm9ABsbo00j7idjoSEluxk3NiaNAsKWcMj1pBLJqoujo1PonkkgvBIivzlL3/RBz/4QfPrE044YVrhkaefflpXX321XnnllXF/7na79d73vlc/+9nPVFNTE/f1ZgpfIGwe5xEeAQAAAAAAAJAEPZaWjnKbj+KoKIiERxhbg3gLhsLqGQ5IkioK7f08mUhVYa62dwxqJBDS0GhIhbmp2aLb2j5gjtE6ojYx7Q/5HrcW1xRpS9uAtrUPaHg0qHxP4n7eQChsbnjPqShIWTAnHhrK8vRqc58MQ2rr82m2TVtU3mo0GNaO/YOSpAVVhcrN8ukAdhhbk5fjsv3vLAdD88iBMieuZiOdnZ365Cc/OePL3XvvvTr11FP1yiuvyO1266yzztLll1+uY489VsFgUP/3f/+n1atXa+/evQlYdWawNo94c3j4AwAAAAAAAEi8bkt4pMzGY2uk2Kb+8GhIw6PBFK8GmcQ63qmiwL7NEZOpKor9TJ0DqdukjLY/SNKR9YkbHXL0rFJJUihs6I2W/qlPPkzNPSMKjSVi5lUWJPS2Es0aKmjuHZ7iTHvZ3jGoQChyHx1RV5Ti1aReTbFXLmck5JROY2sMwzDX01iWZ+sg1nRUF8delzv6fSlcSfpg9zwFPv3pT6u9vV0f/OAHlZs7vV+A9u7dqw9/+MMKhUKaO3euNm7cqL/97W+69dZb9eKLL+oPf/iD3G63mpubddFFFyX4J7Cv8eGR7E41AgAAAAAAAEiO3rE2BUkqs/mneK2b+rSPIJ6sj6fKDGweqUyTT7hvsgQ5jqhLXHjkqLHwiCS9muDRNdGRNZI0x+ZNHeMaKdIoVHC4rKGlpQl83NmFy+lQ7djIlHRqHtk/6Jc/GJni0FiW2SNrJKnaEurrSGGoL50QHkmyO+64Q3fffbcqKip04403Tvty1157rUZGIi8ev//977VkyZJx3//gBz+oa665RpL0zDPP6J577onfojPIiCU8ku8hPAIAAAAAAAAg8ayNCmX59t4Ut44T6RoiPIL4sYZHMnJsTRo2jyQyPHK0JTzySqLDI52x8MhcuzePlMXCL+kUKjhcW9qS87izk4axcEbfSECD/vRo8mq2BJYay+wdxJqOwly3OaliP+ERSYRHkqqlpUVXX321JOlnP/uZqqurp3U5n8+nP/7xj5KktWvXau3atROe94UvfEFud2Rm3G9/+9s4rDjzjIzSPAIAAAAAAAAguXozKTwyrnmEjRbET9dQ7PFUnoFja6xtKqlqHgmHDTM80lCap5K8xI3RWlRdqLyxfZiEN49YwiOZNLYms5pHBsxjxtZENFru65Y0CQqND49kfvOIw+FQdVGkAYbmkQjCI0n08Y9/XD09PTr33HP14Q9/eNqXe+KJJzQ4OChJOueccyY9r7q6WqtXr5YkPfLIIwqFQpOem62sY2vyCI8AAAAAAAAASIJuS0NHWUHiNmuTgeYRJEqmj62xNo+k6hPue3uGNTT2Idsj6xPb/uB2ObWioURSZEO6M4GBmaauYfPY9mNrLBv2LX3pESg4XIYRCy1VFnrMzfpsZ72v0yUo1NwTey5lQ/OIFBtd0zcSkD/I3jrhkST55S9/qb/97W8qKSnRTTfdNKPLvv766+bxqlWrpjz32GOPlSSNjIxo+/btM19ohrOOrcljbA0AAAAAAACAJOgZDpjHdm8esW7qWzf7gcNlbR6pyMDmkXFja1LUPLKpJbmjQ46eXWoev9bcm7DbaeqKNI8UeFyqKrT3Y6fY61ZhbmTKQLoECg7X/gG/GTZcWsvImihry0wzzSMpkw7BvnTiTvUCssGuXbv05S9/WZL0ox/9SA0NDTO6vDUEMmfOnCnPtX5/+/btWrJkybRvp7m5ecrvt7a2Tvu60tXIaNg8pnkEAAAAAAAAQDL0jG2a5Xtcth+nXVHI2BokhjWMVJGJzSOFqd+gjLY/SNKRSQiPHNVYah5v2NOrM5bWxP02AqGwueE9p6JADocj7reRTA6HQ7PK87W5tV/NPSMKhMLKcdm7C2BzGyNrJlKfhiOK9mVheKTaEh7pGPBnTePKZAiPJFg4HNYVV1yhwcFBnXnmmfrEJz4x4+vo74/9Y15SUjLlucXFsX/srZebjlmzZs1sYTZkbR6x+3+kAQAAAAAAALCHnuHIprjdW0ckqbyAsTVIjM4MD4+UF3jkcEiGkbrwyKZkh0dmxfa0NjT3JeQ2mntGFAobkqR5lQUJuY1kW1BVoM2t/QqGDe3uGtLCansHLqyhpWQ03tjFuLE1adM8Ehlbk5fjGvfvfSajeWQ8wiOS1q1bp40bNx7WdeTk5OjjH//4AX/+k5/8RE8++aQKCgr0q1/96pCue3g4Nl8qN3fquq28vNgLzdDQ0CHdXibzMbYGAAAAAAAAQBIZhmGOrSkryEnxag5fZUHqR28gM1nH1mRC0Oqt3C6nyvM96hoaHReUSabNrZEGiKJcd1JaBRpK81RZ6FHn4Khe3dsrwzDi3gwSHVkjSXMqMqMxYGF1oXm8vWOQ8EiGso6taUmD8IhhGGaLT2NZnu1bfKarushrHncQHiE8Ikl33XWX/ud//uewrqOgoOCA8MjmzZv1//7f/5Mkfe9739O8efMO6bqtgZFAIDDFmZLfH3tQe73eKc480N69e6f8fmtrq44//vgZXWe6GRm1hEdoHgEAAAAAAACQYP2+oPmp+EzYEC/Oc8vtdCgYNsaNGQEOV/dYk01pfo7tx3RMpqooV11Do9o/4E9IkGIqvcOjZrvB0roiOZ2Jv22Hw6GjZ5Xq0c0d6hsJaHfXsObGuR2kqTMWHon3dafKIktYZHvHYApXEh/R8EiOy6EFVYUHOTt7eHNcZrgqHcbWdA6Oyh8MS8qekTWSVFVM84gV4RFJp5xyioLB4GFdx1uDGsFgUJdffrl8Pp/Wrl2rq6+++pCvu6go9o/EwMDAFGdKg4Oxf0Ssl5uOxsbGmS3MhoYDhEcAAAAAAAAAJE/vcCxgkQnhEYfDoYpCj9r7/eZmP+JrT9ewPnfXK5Jh6AOrZ+nCVQ0qyM387ZxoGKkig0clVBXlakvbgEZDYfX7girJS14bUbR1RErOyJqooxoj4RFJ2rC3N7HhkYrMCI9Ym0fetHl4xB8Macf+yH20oKpQHndmBsMOVUNpnjoHR9U+4NNoMJzSv5/oyBpJaizLjBaf6agqtIZHfClcSXrI/N82puGiiy7SRRddFNfr3Lp1q1544QVJ0gknnKBf/vKXE54XCkXCDB0dHbrpppskSXPmzNE555xjnjNnzhzzeO/evVq6dOmkt7tnz54JL4eIcc0jjK0BAAAAAAAAkGDWgEVZvv3H1khSRUGu2vv96hpKfntCpguFDX3x/zbo1b29kqRXm/v0g79t0QdXz9JlJ87RnAzZHH8rXyCkQX/kQ74Vlo28TFNZOP4T7skMj2xK0eiQo2aVmsev7OnRe1Y1xPX6m7piG95zKzNjw3tuZb6cDils2L955M32QbN9K5mhJbuoL83Tq819Mgyprc+n2SkcvdRsaT/JpuaRakvzSEc/zSOERxLEMAzz+Mc//vFBz9+1a5c+/elPS5Le/e53jwuPrFixwjzeuHGj3vGOd0x6PRs3bpQkuVyuKUMm2coXIDwCAAAAAAAAIHl6h2OjyMsypFGhojDycwRCRtLbEzLdLet36aXdPeP+bMAX1M3rduk363fp9CXV+t6FK1RbMrOx9emuyxKyqizMjOfJRKqKxodHrA0TibbZEh45sj55m/hHzy6VwyEZhvTiWx7b8dDUFWm1KPC4xjUI2Fmu26U5FQXa1TmkHfsHFQ4bSRkzlAibUxRasouG0lhIo7l3OKXhkb1Z2jxSUZBrhrX2DxIeITySIOXl5frUpz510PN+/etfKxQKqbq6WhdeeKEkaeXKlePOOe2005STk6NAIKBHH31UX/ziFye8rqGhIT399NOSpJNPPvmAUTqQRizhES/VWAAAAAAAAAASzNo8Up4p4RHLz9E1mNz2hEy2c/+gfvjwVvPrH7xvhV7a3aN7N7RoNBiWYUj/3NKhq373kv78mbUZ1fjSZdmwqyjIjADARKzBmM4kb1Juaols4jsd0uKaoqTdbrE3R0tqirSlbUCbW/s15A/GbQxTIBQ22xLmVBRk1HNiYXWhdnUOyRcIa1/viGaV23Mz3zouaWld8h53dtFgafho6U3tyJSd+2MjoOakMMSSbC6nQxWFudo/4Kd5RIRHEqa+vt4cQzOVW2+9VaFQSPPmzZv0/LKyMp111lm6//779fDDD2vHjh1asGDBhNc1PBxJhX3oQx86vB8gQ0XH1nhcTrldhEcAAAAAAAAAJFbPcCw8UpqfIeERy6f7u4ZGNb8qhYvJEKGwoX+7+zX5g2FJ0hVr5+qi42brouNm66vnHKE/vLBXN6/bqc7BUW3Y26uX9/Tq2DllKV51/HQNZl7IaiJvbR5JltFg2Bx/sqCqUN6c5DazHzunTFvaBhQ2pA17e3XSwsq4XG9zz4g5EmVeZWaNdFpYXai/b2qXFBldY9fwyJY2mkemYm0e2WcZG5MK29ojQR+HQ0ltRUoH1UWR8EjnoN/WTT/xwO65TVx//fVyOBwKhUK69NJL1d/fP+77r776qr7+9a9LkubPn6+PfvSjqVhm2ouOrfHm8NAHAAAAAAAAkHjW8Eh5xoRHrM0jo1Ociem69ekmc6THnIp8/dvZS8zvlRd49Om3LdBXzznC/LNb1u9K+hoTKWvG1hTGGuOTOR5hx/5BjYYiwaRUbOBbg05vHct0OKIja6TMa0pYWBXbvI8Gf+zGMAxzbE1VUa4qM2SsUDxZm0f29Q5PcWZihcKGGR6ZW1GQ9IBZqkWDfcGwMe73tmzEDrpNrFq1St/73vckSc8884yWLVumr371q/rJT36iT3ziEzrxxBPV39+v/Px83XHHHfJ4MveXq8MRHVuT58muFz0AAAAAAAAAqdE9FDCPS/MzY7xLZYG1eYSK98O1q3NIP3x4i/n1f75vpfI9BxbHn7uyzhwZ9NDGNrX2pfZT6vE0bmxNBm8wVxZZxtYksXkkuoEvSUfWJz88snpOuXkc1/BIZyw8MjcDm0ei7Boeae/3q2c48m8grSMTG9c80pu61/S93cPyBSIBsyVJHGuVLqotrVAdSXxtTkeER2zkq1/9qm666SYVFRWpublZP/jBD/TFL35RN998s0ZGRrR06VI99thjOuGEE1K91LRlhkeyLDEHAAAAAAAAIDV6hzNvHAfNI/ETDhv6t7tfNTftrlg7VyfMr5jwXG+OSx85YbakyKfEf/fs7qStM9GszSMVGfI8mUiVJRiTzOaRTS2pHR0yqzzPbJ14eU+PwmOjZg7XuPBIRWaFRxZYwyP77RkesYaWjqjLvkDCdJTk5ahg7APvLb2+lK1j61jriCQtrs2++6q6yNIKleXhkQOjq0iqK6+8UoFAQPPnz5/W+Z/61Kf0kY98RPfff782bdqkvr4+VVdXa+3atTrttNPkdJIHmsrIaHRsDeERAAAAAAAAAInXbdkUL8uYsTWW5pEkboBnotueadILTZEmhtnl48fVTOQja+bofx/foWDY0B3P7dHnzliUEe93d2ZJ80hZvkcup0OhsDHuZ060zW2W5pEUhEccDodWzynT395o04AvqDc7BrUkDhvUTV2xMR9zKzNrbE1hrlv1JV619Pn0ZvuADMOQw+FI9bJmxPq4O6KW5pGJOBwONZTlaVv7oPb1jigcNuR0Jv9+3tYWC49kY/NIFc0jJsIjKXbjjTfO+DKFhYW6+OKLE7CazBYOG/IHI+ltxtYAAAAAAAAASIbescp+b44zY96XtDZDdA7RPHKoAqGwfvaPN82vfzDJuBqrmmKv3r2yTvdtaFHPcEB/2dCiDx43K9FLTThrg01lYWaErCbidDpUUeBRx4A/aZ9uNwxDm1sjG8OVhbnjNkmT6dix8Igkvbi7O07hkUjzSIHHNa7VJVMsqC5US59P/b6g9g/6x7Uj2EH0cScxtmYqDaWR8MhoMKzOodTcz9bmkSW1hVOcmZmsY2uyvXmEmgpkDV8wZB4ztgYAAAAAAABAMnSPja3JlNYR6a1ja7J7k+VwPL2jSz1j4aJ3rajViQsmHlfzVlesnWse3/J0kwwjPiNAUqlrKPI4cjkdKvbmpHg1iRUNb3QOjsZtfMtU2vv9ZgPSkfWp28A/dm6ZefzS7p7Dvr5AKKzmnhFJ0pyKAtu1ckzHQuvomg77ja6Jjq3xuJyaX5VZY4Xiqb40zzzeN/aYTrZtY+ERj8upORk2Amo6xjePpG58UDogPIKsER1ZI0n5GZLwBwAAAAAAAJC+DMNQbwaGR/I9bvMDet00jxyyB15rMY/PP6ph2pdbNbtMR88qlRTZnH1uV3e8l5Z03WPNI+UFnpSMbEimyrGGjFDYUO9IIOG3F93Al6Qj6lI3jmJZfbE87si2ZDzCI809IwqNhW8ybWRNlDU8ssNm4RFfIKSd+yNrXlRTqBwXW9KTaSizhEd6kx8eGQ2GtXN/pMVnflVBVt5X1raXbB9bk333PrLWsCU8kgkzIAEAAAAAAACkt0F/UIFQZHOzvCBzwiNSrH3EOm4E0zcaDOvhN9olRUZuvG1J1Ywu/9GT5prHt65viuPKks8wDHP8UUWGPU8mUpXk8QibLOGRI1M4OiTX7dJRjSWSpN1dw4f9s0dH1kjS3AxtSlhUHQv7vGmz8Mi29gFFi3WW1jKyZioNluaRlhSER3Z2Dio4dmfFY5yUHSX7dTmdER5B1vAFGFsDAAAAAAAAIHl6hmKtAqX5mTWKI9qe0DU0qtFgOMWrsZ/1OzrVN9Y68fYja2b8gcdzltepemyz65FNbdrbPRz3NSbLoD9oPoaij6tMZv0Zsyk8IknHzInf6BprE0emhkfsPLZmS+uAeZzKxhs7aCxL7diarW2x+2pxTXbeV3kel4py3ZIIjxAeQdYYsYZHGFsDAAAAAAAAIMF6hmOtHJnWPGL9pHR7vy+FK7GnB15rNY/fvaJuxpf3uJ26ZM0cSVLYkH737O64rS3ZrO010UabTGb9hHvnYOI3KTe3RMIjuW6n5lWmNmRx7OxYeOTlPYcXHnneMq5pWUNmNluUF3jMfzvsFh5Jp9BSumsojY1dSsXYmm3tsfDI0ixtHpGkquLIazPhESBLjIzSPAIAAAAAAAAgebot4ZHS/MzaFK8r8ZrHqdjssrPIyJo2SVJhrlunLp7ZyJqoDx0/Wx5XZJvnzuf3aHg0GLc1JlPXUGyjrqIg85tHqi3hkda+xAavhkeD2jU23mVJbZHcrtRuCx5raR55sal7ijOnFg4bem4sPFKan6MjMngsysKqSPtIx4DfbCtKd4ZhaN32TvPrIwiPTKmqKFdup0OS1JyS5pFYMClbm0ek2GvzoD9o239P44HwCLKGtXlkphWAAAAAAAAAADBTvdbmkQwbW1NvaR5pITwyI+u279eAL7Ix9Y5DGFkTVVWUq/OOqpck9fuCenJb50EukZ46s6x5ZE5FrGWgqXMoobe1ubVfhhE5Xlaf+g38isJcs/1k475++Sz7NjOxpW3ADFKcMK9czrGN90y0sMZ+o2te3tNrrvX4ueUqy7DmrXhzOR2qK40EMlPZPFLgcY1rFcs2VUWxUGxHf/a2jxAeQdbwMbYGAAAAAAAAQBJZq8/LCzOrUcEaHkl0e0Kmuf8wR9ZYvXtlrXm8bvv+w7quVLGObqnIgk3muZbRMdFWkETZuC82OmRZfUlCb2u6ou0jo6GwNu7rO6TreGZnl3m8Zn5FXNaVrqLNI5K0wybhkT+8sMc8vui4WSlciX1EQxsDvqD6fclrmBkeDWpP97AkaVFNUUYHsQ7G2gq1PwkjxdIV4RFkDWvzCGNrAAAAAAAAACSaNVRhHfOSCepLGVtzKPzBkP7+RrskqSjXrVMWVx7W9Z0wr0I5rshm37o37dk80mZ5ntRm2PNkIsXeHDMkk+jmEWs4Y3lDeoVHJOml3T2HdB3PZlN4pNrSPLI//cMjg/6gGZArynXrXYcZkMsWDaWxRqJktnm92R57TC3J4pE1UqTNK4rmESALjIyGzWPCIwAAAAAAAAASrS2jwyOMrTkUT23r1IB/bGTNshrlug/vveqCXLeOmR3ZjG/qGtbesU+Q24k1fJQtIxOi7SMdA34NjT0eEuGNlkjziMvp0NLa9NgYXm0Jj7x4COGRUNjQc2PhkbL8nIzf8B4XHrFB88gDr7VoeDTyYe7zjq5nEsA0NZTFXvv29STv39StYyNrJGlxmrxGpIq1eaRjIHsb1QiPIGtYm0e8/GMFAAAAAAAAIMGizSMOh1RdlFnhkYoCjzzuyBZDa2/2brLM1AOvx0bWnLeyPi7XecqiWHvJUzZsH7GGj+qyJTxSERtd05Sg0TX+YEjbxjaGF1YVypsmH6pdUFWoYq9bkvTy7h4ZhjGjy29u7Ve/LxK4OWFeRcaP2agr8apgbE/rzY6Bg5yden94Ya95fNFqRtZMV0OK2ry2tsUeU5kexDoY6+9p1rGD2YbwCLKGzxIeyU+TX5IAAAAAAAAAZK5o80hlYa4ZtMgUDodD9WNtKjSPTI8vENLfN0VG1hR73Tpp4eGNrIk6ZVGVefzUm/vjcp3JFA1ZFXvdKsx1p3g1yTGvMjaioqkzMW0x29oGFQxHghnLGooTchuHwul0mKNruoZG1dQ1s5/fOrLmxAWZPbJGirzWRttHmntGxu11pZs32wf08p5eSdLS2iKtbEyPUUl2MKs89pqwI4kNM9sszSNLsrx5ZNzYGsIjQOYbGY39g0pNFgAAAAAAAIBECobCZu15po2siYqOrhnwB9XvC6R4NenvyW37NTg2ouSsZbVxCxQtbyhRaX6OJGn99k6FwjNrckilcNgwm2vqs6R1RIqNrZES1zyysaXPPF5Wn16b+MdaRte8NMPRNdbwyJr5mR8ekaQFY+ERw5B27E/f0TXW1pEPrp4lhyOzW2HiaVld7Dn6+r6+Kc6Mr2jzSHmBR5WFnqTdbjqyjq2heQTIAsOW8Ei61LMBAAAAAAAAyEz7B/2K7uHXFmd2eESifWQ6rCNr3r2yLm7X63I6dNKCSItJvy+o15p743bdidY55NdoKCwpy8IjlrE1uzoTEx55wxIeWV6fPs0jknTMuPBI97QvFwobem5X5PzyAo8WjYUqMt1Cy8+5PYmtFDMxGgzrnlf2SZI8LqcuXNWQ4hXZS0l+jmaPtY9sau1XcOx1MZF6hkbNho3FNYVZH/Ypzc9Rjivyd0DzCJAFRixVXnmERwAAAAAAAAAkUHQUh5TBzSOWnyvaHoGJ+QIhPTo2sqYkLyduI2uiTlkUu76n3uyM63UnkvVxU1+amc+TiYxrHklQeGTjvn7z+Mg0C48cPatULmdkk/aFpuk3j2xq6deAL9Les2Z+uZzO7NjsXliV/uGRf2xuV/fQqCTpnctqVFaQ3S0Wh2JFQ6R9xBcIa3sSGmbGjaypye6RNVJkRFRVYaR9ZP9A9v5OQ3gEWcM6B46xNQAAAAAAAAASqc0SHqktycxGBWtTxD6aR6b05Lb9Ghprxz57Wa1yXPHdnjl5XHhkf1yvO5GsjTV1Gfo8mUhhrtsckZCI5pFgKKzNrZHwyNyKfBV5c+J+G4cj3+M2N8q3dwxq4zTHdGTjyBpJWmTZ2E/X8MgfXoyNrLnouFkpXIl9rWi0jK5pTvzoGmt4ZHEt4RFJqhpriusaGk1K+0s6IjyCrDEySvMIAAAAAAAAgOTIiuYRxtZM25OWQMdZy2vifv2NZfmaP9Zm8cqeXg34AnG/jUSwho4asmhsjRRrH+kaGlV/nO+vHfuH5A9GNj6XNZQc5OzUeN+xjebx75/bM63LWMMjJ2ZReGRWWZ48Y4GzdAyPtPSO6Mltkde4htI8c4wWZmaF5bk63UDV4dhK88gBos0jhhF5bc5GhEeQNRhbAwAAAADAoTEMQ/v27VNTU5OampoUCBz6BsfIyIja2toUDAbjuEIASD+tlk3x2owNj1jG1vRlb8X7dKzfHtn0znE5dMK8xGx6R9tHgmFDz+7sTshtxJv1cVOfZeGReRWJG13zRkts43l5fXqGRy5c1aCCsZb4+zbsO2jgKRgK6/ldkcd1RYFHC6sLpzw/k7hdTs0bCxs1dQ2lXSPC3S81K2xEjj+wujFrxgnFm/W5+noSwiPb2mJBpEWERyRJ1cW55vH+AX8KV5I6hEeQNazhEa+Hhz4AAAAAAJPp7OzUPffco6997Wt6xzveofLycjU2NmrevHmaN2+etm7dOqPrGxgY0Ne//nXNmzdP+fn5qqurk8fj0Zo1a3TLLbck6KcAgNRq7c/85hHrmBHG1kyuuWfYHE2yanaZCnLdCbmdUxZVmcfrbDK6ZvzYmsx8nkwm2jwixX90zcZ9/ebx8obiuF53vBTmunXBqgZJ0vBoSPe+sm/K8ze19mvAHwkfr5lfIYcjuwIK0bBMIGRod/dwilcTEwyF9ceXIiNrHA7pA6sZWXOoSvJzNLs8X1Lk8Z7IkJBhGNrSFnmdqCvxqiQvvUZbpUp0nJgkdQxkZyg2Mb+hAGnINxYecTpk1nsBAAAAAIAD/frXv9bXvva1cX/m9Xrl8838DbQdO3bojDPO0J49kTpyj8ejsrIydXR06LnnntNzzz2nP//5z/rTn/6knBzetASQOdosjQo1xZm5KV6Q61Zpfo56hwOMrZnC+u2d5vHJCxM3zmHN/HK5nQ4Fw4aeerPz4BdIA9HHjcORuQ09k5lXmW8eN3XGNwyw0dI8sixNm0ck6ZIT5uiOsZE1v39ujy5ZM2fSUMgzO2Ija9YsyJ6RNVHWppU32we0oCr1zSuGYeib923U3u7I8/iURVVZN34q3lY0lGhP97B8gbB27B/SktrENIK09/vV74uEsRJ1G3ZUZQ2P9NM8AmS0kdFIeCQvx5V1iVQAAAAAAGaiqqpKF154of793/9dDz/8sLq6uvSpT31qxtczMjKis88+W3v27JHH49H//M//qL+/X21tbWpra9PHPvYxSdJf//pXfe5zn4v3jwEAKRUNj5QXeOTN4DHa0faR9n6fQtG5BRjHGuQ4KYHhkSJvjlbNLpUk7ewcUnNP+rQTTKZl7HlSU+RVTpZ96NPaPNLUFb/mkXDY0KaWSKNAfYlX5QWeuF13vB1ZX6xjxh6zW9oG9NLunknPfXZnLDxy4vzyRC8t7RxZH2uQSZexVP/z2Hbd+XykdcTjcuoLb1+U4hXZ3/KG5Iyu2do+YB4vYWSNqbooFmJkbA2Q4aJja/I8FO4AAAAAADCVj3/847rnnnv09a9/Xe985ztVXn5ob9D/13/9l7Zv3y5JuvHGG/WZz3xGubmRT3NVV1fr5ptv1nnnnSdJ+tWvfqUNGzbEZf0AkGqhsKH2sbE1tRnaOhLVUBr5+QIhQ52D2bnRMpVw2NDTY40JRbluHdWY2BaI8aNr0rt9xB8MmZtzdaWZ/TyZyJzyxIyt2dM9rMGx8S7LGtK3dSTqIyfMMY9/P9ZC8lbBUFgvNEWCJZWFuWnRupFsJy6okNsZ+WD0E9tSP5bq7pea9aNHtplf/+iDR+mY2WUpXFFmWGENjzT3Jux2trXFwiOLCY+Yxo+tyc7faQiPIGv4zPAID3sAAAAAABLNMAzddNNNkqS5c+fqE5/4xITn/fu//7skKRwOm+cDgN11DfoVHGvhqM/wTfF6y4iCfYyuOcDmtn51D41KiozacCe4XePkRbFmk3QfXWMd7VSfhaMu8jwu1Y2N6oln88j4kTXFU5yZHt69sk6l+ZHRhQ+81mo+X6w2tvSbgZg188uzsl2+2JujY+ZEwhm7Ooe0O46PmZl66s39+uqfXjO//to5S3X+UfUpW08mWZGK5hHG1pisY2toHgEynHVsDQAAAAAASKwXXnhBzc3NkqT3vve9cjonfhtqxYoVWrx4sSTpz3/+c9LWBwCJ1GrZFK8tyezwSHRsjSS19vqmODM7Wds/Tk7gyJqolQ0lKvZG2rfX7+hM61FCLZbHS0MWhkckaW5FpH2kdzig3uEDQxOHYuO+fvN4eX36N494c1x6/zGNkqTRUFh3v7T3gHOsI2vWzK9I2trSzWmLY81CqWof2dTSr0//7mUzIHn5iXP0yVPnp2QtmagkP0ezy/MlSZta+xUMhRNyO9vGwiMOh7SwOvuafCZTWWhtHsnO32kIjyArGIah4QDhEQAAAAAAkuXll182j0844YQpz127dq0kqaOjQ/v27UvougAgGazhEWu4IhNZm1VaaB45wLrtlvDIosSHR9wup9YuiNxO73BAGxP4yfXDZX281GV4yGoycyvjP7rmDUvzyHIbjK2RpA+fMNs8/v1zexS2hJ66h0b14Out5tcnLsje8MjblsTCI49vTX54ZG/3sD566/NmC8w7j6zRt85blpVNMIkUbR/xBcLasT/+DTP+YMgMj8wpz5eXfVOTx+1UdVGu6kq844Ik2cSd6gUAyeAPhmWM/a7BiyAAAAAAAIm3ZcsW83j+/Kk/jThv3jzzePPmzWpoaJj27UTbTSbT2to65fcBIBHa+mKb4rXFmb0p3sDYmkn5AiE9v6tbUiQcMd8SFEikUxZX6m9vtEmKjJc4alZpUm53plotz5NsHFsjadxjYlfnkFbNLjus6zMMQ2+0RJpHKgo8qim2x+bn/KpCnbSwQuu3d2l317DW7+jUCfMq9NtnmvTTf7ypAV8krFBTnJu051E6OrKuWFVFudo/4NfTOzrlC4SStuf18p4effK3L6pzMNKQs2p2qX568Sq5nARH4m15Q4keGAtMvb6vL+5jZV5q6pEvEGk0iY5CQsxzXz8zqwNRhEeQFXxjrSNSZI4gAAAAAABIrK6uWL14VVXVFGdKlZWxT2J3d3fP6HZmzZo1s4UBQBK09lubRzI7PFJn2fS3hgEgvby7R/5gZIPu5IWVSduMOmVh7N/d9du7dPUZi5JyuzO1j7E145pHmuLQPNLa51P3UGRzf1lDia02QC85YY7Wb4/8/vjDh7eqfySgpq5h8/sFHpe+/96VtvqZ4s3hcOi0xVW6+6Vm+QJhvdDUrVMWTf17djzct2Gfrrn7NY2OvZ7NryrQry9bzX5bgqywNAZt3Nen9x/bGNfrt448so5CQkQ2v8ZIjK1BlhixhkdoHgEAAAAAIOEGBwfNY6936o3T/Pz8CS8HAHbVZhlbU5vh4ZGaolxFP3jeYgkDIPkja6JmV+Srfuxxt2FvrwKhcNJueyYYWyPNq4z9DrTLEpQ4VNYxRcvriw/7+pLp7UfWqLoo0pTyWnOfGRxxOKQPrm7UY//6Np2+tDqVS0wLyRxdEw4b+q+/b9Pn79pgBkfWzC/Xn65aq4osHemRDMsbYs/d1xMweiwaHnE4lJTwEeyF5hFkhZFRwiMAAAAAACSTyxX77+9weOpNK+v3rZebjr179075/dbWVh1//PEzuk4AOFytWRQecbucqi32qqXPNy4MgPHhkbULkhcekaTVc8v1l1dbNBIIaVNLf1qOrok21eS6nSov8KR4NakxqzxfTocUNuLTPBIdWSNFRl/YSY7LqYuPm6Wf/XO7+WcnzCvXN8890nY/SyKdsrDKfMw8sW2/vpmg2xkZDelf735VD7wWGwF50epZ+s57lsvjppsgkUrzPZpdnq893cN6o6VPwVBYbld8/s7b+33a0jYgSVrZWJq1r72YHOERZAVr84iXGi0AAAAAABKusLDQPB4envqTtNbvWy83HY2N8a1xBoB4iG6Kl+TlKN+T+W/D15XmqaXPp66hUfkCIXn5AJ96h0fNT4wvrS1SVVFyP6V/3LxIeESSXmjqTrvwiGEY2tcTeZ7Ul+Zl7ZiAXLdL9aV5au4ZUVPnkAzDOKy/izdaYi0Fy2zWPCJJHzt5ntZt75Q/GNbnzliks5bVZO1jYzIl+TlaNbtML+3u0faOQTX3DKuxLP/gF5yBQX9Ql938nF7e0ysp0lDx9XOO0CdOmcf9kSQrGkq0p3tYvkBYO/YPaUltUVyul5E1OBiiYcgKPsbWAAAAAACQVLW1teZxa2vrFGdKLS0tE14OAOwoHDbU3ueXlD2jOOpL88xja+tKNnt6R5cMI3J88sLkto5I0nFzy8zjF5q6k377B9PvC2porDG8vjQ7nieTmVdZIEka8AfVNTR6WNe1cV+keaTI69bs8vgGCpKhNN+jez5zkh74l1N09vJaggqTeNvixI2u8QVCuvK2F83gSIHHpV9dulpXnjqf+yOJrG078RxdQ3gEB0N4BFlhZDRWf5tP8wgAAAAAAAm3bNky8/jNN9+c8lzr94888siErQkAkqF7eFSjocj7kZk+sibKuvnP6JoI68iakxYlPzyyuLpIRd5I682LTT0yokmWNBFt55Gk+pK8Kc7MfHMrCszjwxld0znoV1t/JLy1rL6Yjf4MdtqS2Ka/NQxwuAKhsK6+4xU9s7NLUqQ96/+uOlFvP7ImbreB6VlhCY9sjFN4JBgKa92bkX+bir1uHdXIOCgciPAIssK4sTU0jwAAAAAAkHBr1641j5966qlJzzMMw/z+0qVLVVZWNum5AGAHbZbmjaxpHrFs/hMeiVg/Fh7JcTl0wrzypN++0+nQ6jmRf1O7hka16zBCCYlgfZzUlWZ5eKQyFh45nPvpjZZ+83hZPZvCmWx5fYkqCz2SpKe3d2o0GD7IJQ4uHDZ0zR9f1aOb2yVFGkdu+9jxPJZSZHlDbOxUvJpHXm3uU99IQJJ0yqIquV3EBHAgHhXICiOMrQEAAAAAIKkWLFigo48+WpJ0zz33aGho4s2Qhx9+WO3tkTepP/CBDyRreQCQMNaxLbXF2bEpbh1b09LL2Jq93cPa3TUsSTpmdpnyPe6UrOM4S2gl3UbX7LM8ThqyfmxNbLxMU9ehh0de29trHls3npF5nE6HTl0UaR8ZGg3pxd2H9/w2DEPX/uUN3bshMkrS43bqV5et1tGzSg93qThEpfkezSqP/Nu6qaVfwdDhB4QYWYPpIDyCrOAbtYRHGFsDAAAAAEBSfOUrX5Ek9fX16Zprrjng+4ODg/ryl78sSSosLNRnPvOZpK4PABKhrc/aqJAdm+KMrRnPOrLmlBSMrIk6bq41PNKTsnVMpNXyOKnP8uaReZWF5nFT5/AhX89TlsfdsbOT33aD5Bo3umbr4Y2uueGRbbr92d2SJJfTof/+0CqtXZi61y5EREfXjARC2rH/8NujrOGRUwmPYBKER5AVaB4BAAAAAGD6wuGwmpqaxv2vvz9Whd7S0jLuex0dHRNez8UXX6xzzz1XkvTzn/9cH/zgB/X4449ry5Ytuvvuu3XSSSdp06ZNkqQf/vCHqq2tTfwPBwAJ1prtY2v6CI+sezO2iX9SCjdgVzSUyDM2luDFNGseGTe2piS7wyONZXlyOR2SpJ2HOLZmwBfQy7sjAaG5FfmaXZF/kEvA7k5ZVCVH5GGjxw8jPHLzul3678e2m1//6AMr9c5l/E6eDlY0lJrHhzu6pntoVK8190qSltYWqTZLfj/BzKWmKw1IsmFL84iX8AgAAAAAAFPq7u7WvHnzJv3+WWedNe7rCy64QPfee++E5/7hD3/QRz7yEd1777364x//qD/+8Y/jvu/xePS9731PV1111WGvGwDSQVsWhkdK83OUl+PSSCCU9c0j4bChp3dEwiNFXrf5yfFU8Oa4tLKxRC/u7lFT17A6BnyqLkqPx6R1vFF9ljT0TCbH5dSssjw1dQ1rd9eQDMOQI5oKmKand3QpGDYkMY4iW5QXeHRUY6k27O3V1vYBtfaNzDiI9dDrrfruA5vMr6+/YJkuXNUY76XiEFn//di4r0/vP/bQ75un3twvI/ISwWsEpkR4BFlhXPMIY2sAAAAAAJiSy+XSnDlzpn1+dXX1pN/Lz8/Xn//8Zz3yyCO64447tGnTJvX19am6ulpr167Vxz72MS1ZsiQeywaAtGBtHqnNkkYFh8OhulKvdu4fUkuv75A2vzPFlrYB9QwHJElr5lfI7UptAfxx88r14lgjxUtNPTpnRV1K1xMVbagpy89RvoetqrmVBWrqGtbwaEgdA37VFM8sUPMk4yiy0mmLq7Rhb6+kyOiai4+fPe3LvrS7R1/4wwYzUPAvZyzUZSfOjf8icciWNxSbx4fbPPLktlgjFq8RmAr/IiMr+BhbAwAAAADAtJWVlampqSmu1/nOd75T73znO+N6nQCQjtr6I+GRoly3CnOz5y34htI87dw/pJFASH0jAZXme1K9pJSIto5I0toFFSlcScRxc8v087Hj55u60yI8EgobZkNPto+siZpbUSApEgDZ1Tk0o/CIYRh6Yiw84nE5tWZ+6h93SI63LanST//xpiTpgddbddFxs6YV3NvVOaRP3PaC/MGwJOm9xzToi+9YnNC1YuZK8z2aXZ6vPd3Der25T12DflUU5s74esLh2GtEXo5Lq+eWxXupyCCpjbwCSTIySngEAAAAAAAAQGIZhqHWsUaF2iwZWRNVbwkB7Mvi0TVP7+gyj9cuqEzhSiKOnV1uHr/Y1JPClcR0DvrNESv1pYRHJGleZYF53NQ5NKPL7uocUnNP5Dm3em6ZCrIotJbtVjaWqnIsTPDUm536z4e3HvQy3UOj+ugtz5sNSWsXVOj7712ZtW1R6e6dR9ZIkkZDYd31wt5Duo7Nbf3qHPRLitzfuW72STE5wiPICuPH1vCwBwAAAAAAABB/fSMB+QKRT3JnW3ikrjT287b0+qY4M3MFQmE9tzMSHqks9GhxTWGKVySV5OdoSU2RJOmNlj4N+oMpXtH4cFFDaXY9TyYz1xIe2dU1s/DIE5aRNacxjiKruJwOXX/BMkVzHz9/fId+9eTOSc/3BUL6xG0vqKlrWJK0pKZIN116rDxu9s3S1WUnzjXv3989u1uBUHjG1zHuNWIJrxGYGq8GyArjwyOkbgEAAAAAAADEnzU0UZdl4RFrg0S0fSXbvL6vT0NjLdgnLqhMm0/yR0cUhA1pw57e1C5GUoslPFJH84gkaV7FoTePPGnZGD6V8EjWedeKOl1/wXLz639/cLPufqn5gPM27uvT5b95Xi+PvQZUF+Xqlo8ep2JvTrKWikMwuyJfZy6tliS19vn0yBvtM76OJ7YSMMP0ER5BVvAxtgYAAAAAAABAgrX1xzbFa0uya1O8oZSxNc+MG1lTkcKVjHf8vNjomheaulO4kohWS8iKsTUR9aVe5bgiYaOd+6cfHvEFQnp2Z+Q+rS7K1dLaooSsD+nt0jVz9MW3Lza//sqfXtOjmyIhgzfbB/Tp372kc29cp+d2RR4rBR6XfnPFcTz/bOKKtfPM49uebprRZQd8Ab20OzKybG5FvuZYgmrARKhgQFYY1zxCeAQAAAAAAABAArT2ZW/ziPXnzdaxNeu3d5rH6RQeWT03vcIj1nBRfZY9Tybjdjm1pLZIG/f1682OQTV1Do0bZTOZF5t6zP2PUxdXpU3bDZLvX85cqO4hv257ZrdCYUOfveNlnbG0Wn97o02GETuvvsSrGz54tJY3lKRusZiRkxZWaGF1obZ3DOr5pm5t3Nc37fvvsa37FQxHHgA0E2E6aB5BVrCGR3KZ3QYAAAAAAAAgAdos4ZHaLNsUHze2JgubR3yBkF4c+3R3Q2meZpfnp3hFMQ2leWZI45U9vQqEwildj3VsDc0HMeetrDeP//zKvmld5sk3GVmDCIfDoWvPW6bzj4o8jvzBsB7aGAuOVBbm6rrzjtRj17xNJ6ZRuA0H53A4dPnauebX020fGR4N6gcPbTG/PmNs/A0wFXbRkRVGxsbWeHOccjpJ3gIAAAAAAACIv2xuHvHmuFRR4JE0PhyQLV7e06PRYCSUsXZBRdo1QETbR0YCIW1q6U/pWqLPE5fToeqi3JSuJZ2cf3S9og+bezfsk2Gti5jEE1sj4RGHQzplYWUilwcbcDod+tEHjhoXJCrNz9FXz1mqp/7tdF1x0jzlumnnt6P3rmpQkTcyUOS+V1vUPTR60Mv81yPbzKantQsqdBoBM0wD4RFkBd9Y8wgjawAAAAAAAAAkirV5pK44+xoV6kojgZm2fp+CKW63SLZndnSZx2sXpt+n+o+blz6ja6LhopqiXLldbFNF1ZXkmeOOdncN6+U9PVOe39bn09b2AUnSysZSlY2Ft5DdPG6nfnHJsbrmrCX6xruP0JP/drquOm2B8jzsj9lZQa5bF62eJUkaDYZ15/N7pjz/teZe/Wb9LkmRiQzfu3BF2oUakZ74VxlZYXiU8AgAAAAAAACAxGrti2yK53tcKs5zp3g1yVdfEgnMhA2pY8Cf4tUk1/rtnebx2gXp1wBx3Nwy8/jFpqlDCYnkC4TUNfaJeUbWHOjCVY3m8cFG1zy5LTayhkYBWOV5XPrs6Qv1iVPmq9ibk+rlIE4uO3Gu2U70u2d3TxrSDITC+uqfXld4rLzoX85cpLmVBUlaJeyO8AiywshY84iXZCUAAAAAAACABDAMwxzHUVvizcpP+FrDANk0umbQH9SrzX2SpAVVBaopTr+RRYuri8yRBy80dU9rJEoiWEc7ER450NnLa+XNiWzd3f9aqzkKaSJPvGkNj6RfYAlAfM2uyNeZS6slRV5LH9nUPuF5v1m3S5taI+PJltYW6ZOnzk/aGmF/hEeQFRhbAwAAAAAAACCRBvxBswG5riT9wgPJUF8a+7n3ZVF45IVd3QqNfcQ7HVtHJMnpdGj1nEj7SNfQqHZ2DqVkHdZQUV1pdj5PplKY69ZZy2olSb3DAT22tWPC80JhQ+vejLTdFHvdOqqxNFlLBJBCV6ydZx7fur7pgO/v6RrWjx/dJklyOKTvv2+lchgPhhng0YKMFwiFFQhFfnEnPAIAAAAAAAAgEdosjQq1xdnZqNBYlm8eN3UOp3AlyTV+ZE1FClcytePnxdb23M7ulKzBGipqoHlkQheuajCP//zyxKNrXm3uVd9IQJJ08qJKudkcBrLCSQsrtLC6UJL0fFO3PvyrZ/U/j23Xq3t7FQyF9fU/vy5fINJYdPmJc3X0rNIUrhZ2xL8myHjR1hEpMucNAAAAAAAAAOLNOo4jW5tHFtcUmcdb2/tTuJLkenpHl6TIp7zXzE/f8Mia+eXm8bM7u1KyhtZey9iaEsIjEzl5YaUqC3MlSf/c0qG+4cAB5zy5zTqypippawOQWg6HQ1esnWt+/fSOLv3w4a264H/W66hvP6J1Y2HG+hKv/vWsJSlaJeyM8Agy3og1PELzCAAAAAAAAIAEaOuLNSrUZml4ZG5FvjzuyLbDlraBFK8mOXqGRrWpNRKUObKuWGUFnhSvaHLLG0qUP/YBy+d2dckwjKSvgbE1B+d2OXXB0fWSpNFQWPe/3jLu+75ASH/b2GZ+fSrhESCrXHzcLH3i5HkHtDcNjcb2Q7974XIV5rqTvTRkAMIjyHi+0bB5TPMIAAAAAAAAgESgeSSy6b24JlKn39Q5NK4VOlNZGzzSeWSNJOW4nFo9N9I+0t7vV1NX8kcLtfQxtmY6rKNr7n0lNrqme2hUH/n1c2Y4a2ltkepocAGyitvl1DfOPVLrvnK6Hv/Xt+nfL1yud62oVWl+jiTpkjWzdcbSmhSvEnZF5AgZz9o84nUTHgEAAAAAAAAQf9ZxHNnaPCJJS2qKtXFfv8KG9Gb7oFY0lqR6SQm1fkenebx2QWUKVzI9a+aXmyNPnt3ZpXmVBUm9/X09kfBIXo5LJXk5Sb1tO1lWX6xF1YV6s2NQLzT1aG/3sEJhQx+99QXt6hySJOV7XLru/GUpXimAVHE4HJpbWaC5lQX6yAlzFA4b6hsJmCES4FDQPIKMNzQaNI/zcwmPAAAAAAAAAIi/1n5r80j2NgEcUVdkHm9p60/hSpLj6R2R5hGX06Hj5pWneDUHd8K8WDvKc5bWlGQYGQ2pqSsSfFhQXSCHw5HU27cTh8OhC4+JtY98/6EtuvB/15vBkeqiXP3fp07Umvnp3XYDIHmcTofKCjy8tuKwEB5Bxhvyx8IjzPcCAAAAAAAAkAitvZFGBY/bqbIs/tTvklpreGQghStJvLY+n3buj2zmH9VYYov3n1c2ligvJ/Ihy2d3dsswjKTd9tb2AYXHbu7IuuKk3a5dvefoBkX3gB94vVU9wwFJ0uKaQv35sydpeUNmt/oAAJKP8Agy3pA/NrYm35P+v7wDAAAAAAAAsJfRYNhsVJhTnp/Vn/pdWhsLBWzN8PDIuu32GlkjSTkup1bPLZMktfX7tLtrOGm3vakl1kRzBOGRg6ovzdOaeeObRU5aWKG7P71WDaXZ224EAEgcwiPIeOObRxhbAwAAAAAAACC+tncMKhCKVCocWZ/dm+JVRbmqKPBIyvyxNY9v7TCPT11clcKVzIx11Mlzu5I3umZza+zxQPPI9HzohNnm8fuOadQtVxyvYm/2NhsBABKLGgZkvOHRWHiE5hEAAAAAAAAA8cam+HhL64q0fnuXOgdHtX/Ar6qi3FQvKe6CobCeejPSPFLkdeuY2aWpXdAMrJlfbh4/u7NbFx03e4qz42eT5XlyRJaHrKbrvJV1ckhyOx06e3ltVrcaAQASj+YRZLxBy9iaAhvMnAQAAAAAAABgL9ZN8WxvHpGkJTWZP7rm1eZe9Y0EJEmnLKqU22Wf7ZYVDaXy5kTW++zOLhmGkfDbDIcNM2Q1qzyP9oxpcjgcOu+oep2zoo7gCAAg4ezz2wxwiKzNIwWMrQEAAAAAAAAQZ5taLI0KNI9oaV2ReZypo2ue2LrfPH7b4uoUrmTmPG6nVs+JtI+09vm0t3sk4be5u3tYw6ORD3oeUctzBACAdER4BBlv0G8Nj9A8AgAAAAAAACB+DMMwm0eqi3JVWZh5I1pmammtNTySmc0jj2+LhUdOW1KVwpUcmhPmWUfXdCX89qwBK9p5AABIT4RHkPGGrWNrPIRHAAAAAAAAAMRPS5/PHF/CpnjEouoiOccmbGTi2JrOQb9ea+6TFAnK1BR7U7yimVuzoMI8TkZ4ZLN1tBPtPAAApCXCI8h4g4ytAQAAAAAAAJAgm1vYFH+rPI9LcysKJEnb2gcUChspXlF8PWlpHXnbEnuNrIla2Vgib05ki+i5Xd0yjMTeR5taaR4BACDdER5Bxhuyjq2heQQAAAAAAABAHLEpPrGldZHRNf5gWE1dQyleTXw9MS48Yr+RNZKU63bpmNllkqR9vSNq7hlJ6O1Fx9YUe91qKM1L6G0BAIBDQ3gEGW/c2JpcwiMAAAAAAAAA4meTpXnkCJpHTEtqYn8XW1ozZ3RNKGyYzSNFuW4dO6csxSs6dGvmx0bXPJPA0TXdQ6Nq6/dJijxHHA5Hwm4LAAAcOsIjyHiDY80jOS6HPG4e8gAAAAAAAADiJ9o8kpcTG9WCWPOIJG1t65/iTHt5rblXPcMBSdJJCyuV47Lve87W8MhzO7sTdjubaecBAMAW7PtbDTBNw6OR8AitIwAAAAAAAADiacAX0J7uYUmRsITLSaNC1NLaWHhkc1vmNI88vjU2suY0m46siTpqVolyxz5w+WwCm0es7TxH0s4DAEDaIjyCjDc4NramwEN4BAAAAAAAAED8bLGEItgUH29WWb7yPS5J0tYMCo88sS0WHnmbzcMjuW6XjpkdGbuzr3dEe8eCUPG2qZXRTgAA2AHhEWS8WPOIK8UrAQAAAAAAAJBJxjUqMI5jHKfTocU1kfaRPd3D5nhxO+seGtWrzb2SpCU1RaoryUvtguLghPnl5vFzuxIzuib6PHE7HVpUU5iQ2wAAAIeP8AgyWjhsaHh0rHmEsTUAAAAAAAAA4sgaHqFR4UBH1MVG12xrt3/7yFNv7pdhRI7t3joStWZ+hXm87s39U5x5aHyBkLbvH5QkLawuVK6bD3kCAJCuCI8gow0HQuYxY2sAAAAAAAAAxFN0HIfDIS2tLTrI2dlnSU3s7yQTRtc8vjUWrjgtQ8Ijq2aXqmjsg5f/3NKh0WA4rte/vWNQoXAkcUM7DwAA6Y3wCDLakKUKkbE1AAAAAAAAAOIlGApr61ibxrzKAuXz4bUDLLW0sWxp7Z/izPQXDht6clskPFLgcWn1nPKDXMIect0unXFEtSSp3xfUszu74nr940Y70c4DAEBaIzyCjGado0nzCAAAAAAAAIB42dk5ZLY0sCk+MWsbyxabN49sbOlT19CoJGntwkp53JmzvXLWslrz+G9vtMX1uje1Eh4BAMAuMue3G2ACw37L2JpcwiMAAAAAAAAA4mNcowLjOCZUmu9RbbFXUiQ8YhhGild06Kwja96WISNrok5bXKXcsTDMI2+0m2Nm4sH6PDmC8AgAAGmN8AgymrV5JJ+xNQAAAAAAAADihEaF6Vky1j7SNxJQe78/xas5dI9ubjeP37akOoUrib+CXLdOXRwJxHQO+vXKnp64XK9hGNo89jypL/GqrMATl+sFAACJQXgEGW14NBYeKWRsDQAAAAAAAIA4Gdc8QnhkUtbRNZvb+qc4M33t6hzSa819kqRl9cVqKM1L8Yri72zr6JqN8Rld09wzooGxD3jSOgIAQPojPIKMNr55hPAIAAAAAAAAgMNnGIbZPFJZ6FFVUW6KV5S+ltbFwiNb2wZSuJJD99dXW8zjC46uT+FKEufMI6rldjokSX97oy0uI4beYLQTAAC2QngEGW14NGQeFzK2BgAAAAAAAEAcdAz41T00KinSqOBwOFK8ovS1pCYWGtjSar/mEcMwdO+GfebX567MzPBIab5Ha+ZXSIo0hliDH4eK0U4AANgL4RFktCFr8whjawAAAAAAAADEwSYaFaZtQXWB2WixudV+zSNvtPRr5/4hSdLx88pVn4Eja6LOWh4bXfPIG4c/uobnCQAA9kJ4BBltyG9tHiE8AgAAAAAAAODw0agwfblul44Y+zva2j6gtj5filc0M9aRNecflZmtI1FnHVmjaInO3+IQHtk89jwp8Lg0qyz/sK8PAAAkFuERZLShUWvzCGNrAAAAAAAAABy+cY0KhEcO6oyl1ebxP7a0p3AlMxMOG/rLWHjE7XToXSvqUryixKou9uqY2WWSpG3tg9qxf/CQr6tvOKB9vSOSIqOdnE5GOwEAkO4IjyCjWcfWFNA8AgAAAAAAACAOos0juW6n5lUWpHg16e8dR9aYx49usk945MXdPWoda0o5dXGVygs8KV5R4p29LDa65uHDaB95bV+veczIGgAA7IHwCDIa4REAAAAAAAAA8TTkD6qpa0iStLS2SG4Xb7MfzLL6YtUWeyVJ63d0jXvfNp3dt2GfeZzpI2uizhoXHjn0oM+fX4793R07p+yw1gQAAJKD3XRktEF/yDwuyGVsDQAAAAAAqdLV1aV7771XmzZtUl9fn6qrq7V27Vq9853vlMeT+Z/kBpA5trT1yzAixzQqTI/D4dDbj6zW757do9FgWE+92amzl9ce/IIpFAiF9eDrrZIkb45zXHtKJptdka8j6oq1ubVfr+7tVUvviOpL82Z0Hb3Do7p/7O+uJC9nXCAFAACkL8IjyGjDo5bmEQ8PdwAAAAAAUuG//uu/9I1vfEMjIyMHfG/evHm65ZZbdNppp6VgZQAwc9Y2hhUNpalbiM28/Yga/e7ZPZKkRze3p314ZN2bneoZDkiKrD2bmq3PXlarzWOjmR55o01XnDRvRpe/+6VmjQbDkqT3H9sobw4f7AQAwA7o00NGi9YfOhxSvodfUAEAAAAASLZvfetb+vKXv6yRkREtXLhQ3/nOd/SrX/1Kn//851VcXKxdu3bprLPO0pNPPpnqpQLAQQVCYd0zNo4jx+XQOWkegEgnJy6oUMHYe7T/3NKhUNhI8YqmZh1Zc8HRDSlcSfJZgz1/e6NtRpc1DEN3PLfH/PrDJ8yO27oAAEBiZU9UFllpaDQytqbA45bD4UjxagAAAAAAyC7PPfecvvOd70iS3va2t+mBBx5Qfn6++f2rrrpKJ510krq7u3XppZdq69at8nq9qVouABzUk9v2q3PQLynSRlFWwNit6cp1u3Tq4io9tLFN3UOjemVPj1bPLU/1siY0MhrSI5siDTPFXrdOXVyZ4hUl1+KaQs2tyFdT17Ce39WtN9sHtKimaFqXfWZnl3Z2DkmSTpxfoQVVhYlcKgAAiCOaR5DRos0jtI4AAAAAAJB81157rSTJ7XbrtttuGxcckaSlS5fq+9//viRpz549+vWvf530NQLATNz9UrN5/P5jG1O4Ent6+xE15vHfN7dPcWZqPbq5XcNjH0x814o65bqz6/1lh8OhDx43S5IUNqTr798kw5heU8zvaR0BAMC2CI8go0XDI4VZNI8SAAAAAIB00NnZqUcffVSS9K53vUuzZ0+8gXTJJZeosDDyqeS77roraesDgJnqHhrVo2OBh8rCXJ22uCrFK7Kf05dWyzlWEP3opvQNj/zl1Rbz+Pyj6lO4ktT52Enz1FiWJ0l66s1O/X0a99f+Ab8e3hgZc1NR4NFZyxjrBACAnRAeQcYyDMMcW5Ofm13JcAAAAAAAUu2JJ55QKBT57/Izzzxz0vPy8vJ00kknSZKeeeYZjYyMJGV9ADBTf9mwT4FQpH3hvcc0yO3i7fWZKi/waPWcyKiaHfuHtHP/YIpXdKDe4VE9vrVDklRdlKsT5lekeEWp4c1x6f+96wjz6+8+sFn+YGjKy/zxpb0KhiPPkQ8eN0seN88RAADshH+5kbH8wbBCY7+oFnhoHgEAAAAAIJk2btxoHi9btmzKc6PfD4fD2rx5c0LXBQCH6o+MrImLtx9ZbR4/moaja25Z32SGhM47ql6uaFVKFjp7ea3WzI+EffZ0D+vmdbsmPTccNnTH2Mgah0P60HGMrAEAwG7YUUfGio6skaQCxtYAAAAAAJBUe/fuNY8bG6feZJ01a5Z5vGfPHh1zzDHTvp3m5uYpv9/a2moeDwwMqL+/f8Lz8vPz5XZH3j8IBoMaHh6e8nqLi4vNY7/fL7/fP+m5LpdLBQUF5tcjIyMKBAITnvvMji6VFOapsqRQJXk5KsnL0ahvWOFweNLrz8vLU05OjqRIAGdwcOpP8hcWFsrpjHymLBAITNn24nQ6zbFCkuTz+TQ6Ojrp+Tk5OcrLyzO/HhoaMhtoJpKbm6vc3Fzz68nun6h0uZ8kyePxyOv1ml8PDg5yP43JxPvpzfZBNbV2qcAhHVlXpNo8Q/39/dxPk5jqflo7u0AFjsjxExv36uKjq9Lm+TTkD+rO9dskOeR2OnTF2rlZez9F/dsZc3R5U7vChvSLf27V+45pVE1x5L6y3k/P7OxST2+/ChzSmvnlKs0JKhAI8Lo3CTu87k2G+2li3E/cTxL301S4nyYWj/vJ+nd7uNhRR8Ya8seeWIRHAAAAAABIroGBAfPY+ubZRKxvDB7sjbu3sgZPDub2229XSUnJhN+75JJL1NDQIElqb2/X7373uymv6ytf+Yp5/Oqrr+qxxx6b9Nz6+npdeuml5tcPP/ywtm7dOun5r/oq9PRInfn1ZSVbVeCc/M3S4iUnqmrWfJXk5SjX8OuZ+++ccu2f/vSnzTcYd+zYofvuu2/ScwsLC/XZz37W/Hr9+vV68cUXJz1/yZIles973mN+fc8996ilpWXS808//XQdf/zx5tc///nPp1x7Ot1Pq1evHjeS6bbbbpvy8XvBBRdo6dKlkiKP84P9rNxPE0vl/XRZ6djBiPTzn0f+frmfJnaw+8n8uxyQfv7z59Lq+XRWrlu3+5bqwlUNmlWer3/84x9Zez+Zaxj7p/NVX4V+8Lct+q8PHi3pwPvJvF+7pZ///Ble96Zgl9e9iXA/TYz7iftJ4n6aCvfTxOJxP1n/bg8XO+rIWEOjluYRjyuFKwEAAAAAIPtYP0kW/VTXZKyfnPL5fAlbk10ZMqb8/h9fatbOZyNhnQJHILZ5N4lv3feGioqKVJKXI+9w+o2MAIBUczqkz56+MNXLSEv3vLxPl66Zo1Wzy1K9FAAAEGcOwzCm/q9PYExzc7P5aZ69e/cetHI21V5s6tb7b3pGkvTxk+fpm+cemeIVAQAAAACQPT784Q/rzjsjDRh79uyZsiHkF7/4ha666ipJ0h133KEPfehD076d6YytiX4ya9OmTean494qHWqXe0cCuvvFZvWPGuoflfpGAur3BTQyPKRBX+TYHzjwrTy/4VJQkRplhwzlO4IHnGM1bLhlyCFJciusXMfEtchOh1TgzZHHm2+O0CnNlYo9DhV53WP/y1Hx2P8Xed0qLfCquqxYxXk5cjkd1GNbZFo99lQy7X56ctt+feVPr0uSzjyiWt99z3LzfO6niR3sfnq1uVdX3f6yJOn0pVX60UXHpvz59Ptnd+u/H9shQ9JZR8/Vjy86WlJ2309Wd7/UrO8/sl2jhkvLG4p10epZau7oUUvvsN7sGNTe7sjf6cdPnqdPnDJPEq97U0n3172pcD9NjPuJ+0nifpoK99PEGFsDJMnQqGVsDc0jAAAAAAAklXU8TG9v75Thkd7e3gkvNx0z+XBLUVHRtN5Yc7vdM3oD7q1v4B1MXl7euDcIo4qLpS+9u2LKy/qDIfWPBNU3EoiES8YCJn0jAfUNB2J/Hv2zkWDknJGABvwHhkqCcipoOCe+MUMaGJZ0kDeCJ1OY61ZJXo6K83JUkjd27M0xgygl+bGvi6N/lper4jy3ct0Hfy8nVffTZA42nsnK6XTOaO05OTkHbfCx8nq9495APxjrm/PTMZO1Z8L9dN+mbRoyIn//7z1h4aQ/D/fT5N56P61dWiRP3hb1DAf0zx0Dkmv831uyn08joyHd/HybhowcOd7SOpLN95PVZacu1V0b9mtb+6A27uvXxn1vvOWMHDkd0odOXqzi4gOvg9e9yaXj6950cT9NjvtpctxPE+N+mhz30+TiGRyRCI8ggw1Z3hApyOWhDgAAAABAMi1atMg83r17t1asWDHpubt3757wcjhQrtulqiKXqoqm/2ZrVDAU1oAvOEHAJBpECZqBlLee0z8SUHiG/cWD/qAG/UHt6538k3mT8eY4YyGTvANDJsWW75nnjAVU8nJccjgcM75NYCKdg349tqVDklRTnKtTFlWleEWZweV06IylNfrTy80aHg3p75vadd5R9Slbzx3P71HnYORTwe9aUaeF1dPfdMoWbpdT1563TB/59XMHfM/pkOpK8nTlKfNUVzL9zT0AAJBe2FFHxrKGR/IJjwAAAAAAkFQrV640j1966SWde+65k5774osvSopUH8+fPz/ha8tWbpdTZQUelRV4ZnzZcNjQ4GhwfLDkLaGTvklCJ30jAQVCM0ue+AJh+QJ+tfdPXmc9mRyXwwyYjGs6sQRMSiwhFPOc/BwVetxyOgmeIObeV/YpOJaceu8xjXLx+Iib84+u159ejowe+/5DW/SOI2vkzUl+g7QvENIvnthhfv25MxZOcXZ2O2lhpW6+fLVea+5TfalXjWX5mlWWr7pSr3Jck7RYAQAA22BHHRnLGh4pzGVsDQAAAAAAyXTKKaeouLhY/f39evDBB3XttddOeF5ra6tefvllSdI555wjl4v/hk9HTqdDxd5I0KKxbGaXNQxDvkD4wIDJBIGTA/5sJKiRwOQzvycSCBnqHBw1WwRmwunQpKGTt7advPWcIq9bbjZPM8qmln799B9vml+//9jpj8nCwZ26qFInL6zUuu2d2tc7ol8+uVP/cmby26f++OJedQxEgmpnLavR0tr41r9nmjOPqNGZR9SkehkAACABCI8gYw2Nxt5YyPfwUAcAAAAAIJlyc3P1oQ99SL/4xS/0/PPP67HHHtPpp59+wHk/+tGPFApF/hv+iiuuSPIqkQwOh0N5HpfyPC7Vlkx/3neUPxiKjdR5S6NJ3/CB43f6RiINKf0jAQ1YPlw0HWFD6h0OqHc4MON1SlJhrtsyVsd9QMCkJH+iETyRy+S6CU6lkz1dw7r8luc14Is8hs5ZXqsFVYwyiSeHw6FrzztSZ//0KYXChv738e16/7GNqi9N3tiT0WBYP3/c2jrC6DQAAJC92FFHxhrfPMJDHQAAAACAZLv22mt1xx13aGBgQJdeeqnuv/9+HX300eb3b7nlFv3kJz+RJJ122mlTjrZB9sp1u1RV5FJVUe6MLxsMhTXgC04QMBk/bqd/5MAQSv9IQOGZTdvRoD+oQX9Q+3pHZrxWb45zwlaT4rf8/0QjePJyXHI4GKcSL52Dfl32m+e0f6yNYtXsUt3wwaNSvKrMtKimSJeumaNbn26SLxDWfzy0RTd+aFXSbv8PL+xRS59PknTm0motbyhJ2m0DAACkG3bUkbGGxzWP8MkNAAAAAACSra6uTn/84x913nnnad++fTr22GN14oknqra2Vm+88Ya2bNkiSZo/f77uuuuuFK8WmcjtcqqswKOyAs+MLxsOGxoaDR4QOJlo3M5E54yGwjO6PV8gLF/Ar/Z+/4zXmuNymKGT4kkCJtZgSrGlCaXQ45bTSfAkasAX0BW3PK+mrmFJ0sLqQv3m8uNoNk6gL759se7bsE89wwH99dUWXbpmjo6fV57w2924r0/ffWCz+fXnUjAyBwAAIJ3wGy8y1iDNIwAAAAAApNxZZ52l5557Tp///Of11FNPaf369eb3vF6vPvzhD+uHP/yhyssTv1EIzITT6VCRN0dF3hw1ls3ssoZhyBcIjw+YDE8cOOmfoAllJBA6+I1YBEKGOgdH1Tk4OrOFSnI6pCLvxK0mxW8JnYw/J0fFXrfcLueMbzNd+YMhfer2l7RxX78kqa7Eq99+7PhDCh9h+kryc/SvZy3R//vzRknSdX95Q3/93MlyJTDU1DXo16duf0n+YCTk9aHjZ+noWaUJuz0AAAA7YEcdGcs6tqaA8AgAAAAAACmzatUqPfnkk9q7d682b96svr4+VVdX65hjjlFRUVGqlwfEncPhUJ7HpTyPS7Ul3hlffjQYnjBk8tbWk4nG7wxY3hObjrAh8/KHojDXPS5MckDTyQHHbvPPct3p0RZsGIZe2t2jG/+5XU/v6JIklebn6PaPH6/60rwUry47XHzcbP3+2T3a1NqvTa39+sMLe/XhE2Yn5LYCobA+e8fL5nipVbNLdd35yxJyWwAAAHbCjnqS+f1+/fOf/9Tzzz+v9vZ25efna/bs2TrllFO0atX0Zjn29vbqvvvu06ZNm8w3W9auXau3v/3tcru5S6OGLGNrCqiVBAAAAAAg5WbNmqVZs2alehlA2vO4naoqylVVUe6MLxsKGxqYYJTOAaET3/gwSvQ4bMzs9gb9QQ36g+ZG/Ex4c5yTt5ocMG7HrZL82Nd5OS45HIfXTPFm+4Du3bBP921oUXNPbP15OS795orjtLCacFuyuJwOXXf+Mn3wF89Ikn70yFa9e0WdSvJz4n5b//7AZj27s1uSVF2Uq5suOTZtgkwAAACpxI56koTDYd1000365je/qe7u7gnPWbx4sf7xj3+osbFx0uv52c9+pq997WsaHh4+4HsLFizQrbfeqpNPPjlu67Yza/NIfi6//AMAAAAAACDzuZwOleZ7VJo/81ErhmFo0B88IHTSP3LguJ3xoZOg+kcCGg2FZ3R7vkBYvoBf7f3+Ga81x+UwQyfFltBJgcelXLdT3hyXcnMixw6HNOCLrLF/7P9bekf0ZsfgAddblOvWjR9epWNmz3BWEQ7b8fPKde7KOt3/Wqu6h0b19T+/rhs+eJS8OfF7b/f/XtyrW59ukiR5XE7ddOmxqimeeTsQAABAJiI8kgTBYFCXXnqp7rrrLknS3LlzdeGFF2rBggVyOp3avXu3/vnPf+qFF15Qb2/vpOGRb3/727ruuuskSfPmzdNll12m2tpabdy4Ubfddpt27Nihd7zjHXr00Ud10kknJevHS1vR8IjH7VROBs1eBQAAAAAAABLB4XCoyJujIm+OGmeYnTAMQ75AeHzAZHji0En/WNjE+mcjgdDBb8QiEDLUNTSqrqHRmS10Ak6HdNLCSl1wdIPOWlajIm/82y4wPV9/1xF6dHO7fIGwHni9Vc29I7rpkmNUV3L444Ne2dOjb/x5o/n19RcsIyQEAABgQXgkCb70pS+ZwZGvfe1r+va3v62cnAP/A2T79u2qqqqa8DpeeOEFffvb35YknXLKKXrwwQdVWFhofv8zn/mMTjrpJPX29uqSSy7Rli1blJs781rLTDI0GgmPFObyMAcAAAAAAAASyeFwKM/jUp7HdUhNDqPB8AQhk7eO1pl4/M6AL3jwGzhgvdLKhhJdcHSDzj2qTtVFtE+kg/rSPP3koqP1hT9skC8Q1qt7e3Xejev180uO0XFzyw/pOsNhQ394ca++/9AWsx3n0jVzdPHxs+O5dAAAANtjVz3B1q1bp//+7/+WJF155ZX63ve+N+m5CxcunPR71157rQzDkNvt1m9/+9txwRFJOvLII/X9739fV111lZqamnTzzTfrM5/5THx+CJsa9kc+rZDvYWQNAAAAAAAAkM48bqcqC3NVWTjzD8SFwoYGfLEGE38gLF8gJH8w8v9hw1CxNzLWJvL/bhXmuuWmrTgtnb28Tn8qz9cnf/uS9vWOqHPQrw/98lldd/4yXbJmzoyu69W9vfrWfRv1anOf+WfHzyvXt847Mt7LBgAAsD2HYRhGqheRyc4//3z99a9/ldfr1b59+1RePvN0dFdXl2praxUMBnXeeefpL3/5y4TnjYyMqLq6WoODgzrllFP05JNPHu7yx2lubtasWbMkSXv37p10vE66WPKNh+QPhrW0tkh/+8KpqV4OAAAAAABIAbu9nwEAiOgeGtXVd7ysp3d0mX/27hV1OndlndYuqFRJ/uTjhXqGRvWfD2/VXS/skXUH5IKj63X9+cunvCwAAEC2onkkgbq7u/XAAw9Ikt797ncfUnBEkp544gkFg5HqxTPPPHPS8/Ly8rR27Vo98sgjWr9+vUZGRpSXd/izIO0oGArLH4xUENI8AgAAAAAAAAD2Ul7g0W8/drz+46EtunndLknSA6+36oHXW+V0SCsbS3XKokqtbCxV56Bfe7qHtXfsf9s7BjU0GjKva3FNoa6/YLnWzK9I1Y8DAACQ9giPJNAzzzyjcDgSYDj11EjzxZtvvqn77rtPu3btktPp1OzZs3XmmWfqmGOOmfR6Nm7caB4vW7ZsyttctmyZHnnkEYXDYW3ZskWrVq2Kw09iP9b/MCjI5WEOAAAAAAAAAHbjdjn1zXOP1PKGYn3z3jc06I98yDJsSBv29mrD3t4pL1+Y69YX3r5Il6+dqxzGFAEAAEyJXfUEev31183jefPm6VOf+pR+9atfaaJJQW9729t06623as6cA2c27tmzxzyO1qxOxvr9PXv2zCg80tzcPOX3W1tbp31dqTY8GjSPCzw8zAEAAAAAAADAri5c1aizltXquV3dempbp9Zt369t7YMTnutwSHXFXp2yqEpffudiVRd7k7xaAAAAe2JXPYG6u7vN469//evauHGjqqurddlll2nRokXq6enRX//6V61fv16PP/641qxZo+eff/6AgMjAwIB5XFhYOOVtWr9vvdx0HCyYYid5OS597oyFGvKHtLS2KNXLAQAAAAAAAAAchnyPW6cvqdbpS6olSW19Pq3b3qndXUOqKfZqdnm+ZpXnq77Uq1w3o8wBAABmivCIpN/97nd69NFHD+s6vF6vbrrppnF/Njw8bB5v3LhRq1ev1iOPPKKysjLzz7/yla/ou9/9rr75zW+qra1Nn/70p3X//fePux6fz2ce5+TkTLmO3NzcCS+XbUrzPfryO5ekehkAAAAAAAAAgASoLfHq/cc2pnoZAAAAGYPwiKRnn31Wt91222FdR0FBwQHhkYKCAvPY4XDot7/97bjgSNQ3vvENPfTQQ3r66af1wAMPaOfOnZo/f/6E1+P3+6dcx8jIyISXm469e/dO+f3W1lYdf/zxM7pOAAAAAAAAAAAAAACQ3giPSLr00ku1evXqw7qOiRpBSkpKzOOVK1fqiCOOmPTyF198sZ5++mlJ0rp168aFR6zX09vbO+V4mb6+PvO4uLh4eosf09hIShsAAAAAAAAAAAAAgGxDeETSCSecoBNOOCHu17to0SLz2BoGmYj1+62treO+t3DhQvN49+7dWrFixaTXs3v37glvHwAAAAAAAAAAAAAAYCLOVC8gkx199NHmcSAQmPJc6/ff2mKycuVK8/jll1+e8npefPFFSVJ+fr4WLFgw3aUCAAAAAAAAAAAAAIAsRXgkgRYtWqSlS5dKkl5//fUpz33ttdfM47eGPk499VQVFRVJkh588MFJr6Otrc0Ml5x99tlyuVyHtG4AAAAAAAAAAAAAAJA9CI8k2Mc//nFJkXEykwU/RkZGdMstt0iSCgoKdPrpp4/7fm5uri6++GJJ0nPPPacnn3xywuu54YYbFAwGJUmXX355XNYPAAAAAAAAAAAAAAAyG+GRBPvc5z5nNol89KMf1dNPPz3u+z09PbrooovU1NQkSbrmmmtUXFx8wPVce+21KiwslCR95CMfOaDJ5Pbbb9ePf/xjSdIpp5yi888/P94/CgAAAAAAAAAAAAAAyEAOwzCMVC8i023evFmnnnqqOjs75XA4tHr1ai1atEi9vb166qmnNDAwIEl6//vfr7vuumvScTMPPvigLrjgAgWDQTmdTp1yyimqra3Vxo0b9cYbb0iS5s6dq6efflp1dXVx/zmam5s1a9YsSdLevXvV2NgY99sAAAAAAACIJ97PAAAAAADg4AiPJMm+ffv0pS99SX/+858VCATGfa+xsVFf/epX9ZnPfEYOh2PK63nxxRf1L//yL3rmmWfG/bnH49HFF1+sG264QZWVlXFfv8SbLQAAAAAAwH54PwMAAAAAgINzp3oB2aKhoUF/+MMf1Nvbq5deekkdHR3yer1auHChli9fftDQSNTq1av19NNPq6mpSZs2bVJfX5+qq6u1evVqlZSUJPinAAAAAAAAAAAAAAAAmYbwSJKVlpbqzDPPPOzrmTt3rubOnXv4CwIAAAAAAAAAAAAAAFnNmeoFAAAAAAAAAAAAAAAAIHUIjwAAAAAAAAAAAAAAAGQxwiMAAAAAAAAAAAAAAABZjPAIAAAAAAAAAAAAAABAFiM8AgAAAAAAAAAAAAAAkMUIjwAAAAAAAAAAAAAAAGQxwiMAAAAAAAAAAAAAAABZjPAIAAAAAAAAAAAAAABAFiM8AgAAAAAAAAAAAAAAkMUIjwAAAAAAAAAAAAAAAGQxd6oXAPsIBoPmcWtrawpXAgAAAABA/NXW1srt5q2STMP7GQAAAACATBav9zN4RwTTtn//fvP4+OOPT+FKAAAAAACIv71796qxsTHVy0Cc8X4GAAAAACCTxev9DMbWAAAAAAAAAAAAAAAAZDGHYRhGqhcBe/D5fHr99dclSVVVVVT54gCtra3mp7ief/551dXVpXhFyFQ81pAsPNaQLDzWkCw81pAMdn6cMbYmM6Xr+xl2fq5kK+4z++E+sx/uM3vifrMf7jP74T6zH+4z+7HzfcbYGiSd1+vVcccdl+plwCbq6uqoe0ZS8FhDsvBYQ7LwWEOy8FhDMvA4Qzqww/sZPFfsh/vMfrjP7If7zJ643+yH+8x+uM/sh/vMfrL1PmNsDQAAAAAAAAAAAAAAQBYjPAIAAAAAAAAAAAAAAJDFCI8AAAAAAAAAAAAAAABkMcIjAAAAAAAAAAAAAAAAWYzwCAAAAAAAAAAAAAAAQBYjPAIAAAAAAAAAAAAAAJDFCI8AAAAAAAAAAAAAAABkMYdhGEaqFwEAAAAAAAAAAAAAAIDUoHkEAAAAAAAAAAAAAAAgixEeAQAAAAAAAAAAAAAAyGKERwAAAAAAAAAAAAAAALIY4REAAAAAAAAAAAAAAIAsRngEAAAAAAAAAAAAAAAgixEeAQAAAAAAAAAAAAAAyGKERwAAAAAAAAAAAAAAALIY4REAAAAAAAAAAAAAAIAsRngEAAAAAAAAAAAAAAAgi7lTvQAAmWNgYEADAwMqLS1Vfn5+qpeDLGAYhnbv3m1+XV5eruLi4hSuCJlqaGhIg4ODqqqqktNJ9hbx19/fr4GBAXm9XpWVlfE4wyFpa2uTz+eTJNXU1CgvL++Qrsfv96u7u1sVFRXyeDzxXCIygGEYam5uVigUkiTNmjVLLpdrxtczODio/v5+lZSUqKCgIN7LBGwhFAqps7NTBQUFKiwsTPVyMA3Dw8Pq6OiQJHm9XtXW1qZ4RTiYvr4+DQ8Pq6ysTF6vN9XLwTQEg0F1dnbK7XarrKzskH7PQOp0d3erv79fkuR0OjV79uwUrwiSNDo6qpaWlmmdW1BQoKqqqgSvCIdjeHhY/f39qq6u5v2jNNLb26ve3t4ZXaaoqEgVFRWJWRAOSSgUUk9Pj/x+v0pKSrLyv9N4VQFwSNrb23X77bfryiuv1JFHHqmCggIVFxeroaFBBQUFmj9/vq6++mpt37491UtFBvvJT36iefPmmf/75S9/meolIYM888wzuvTSS1VZWanCwkLV1tbK6/Vq2bJl+sY3vqGtW7emeomwuWeffVYf/vCHVVNTo5KSEjU2NqqyslLFxcU644wzdPvttyscDqd6mUhT/f39uv/++3Xttdfq3e9+t6qrq1VXV2f+m/jEE0/M6Pr8fr/+4z/+Q0cccYS8Xq/q6+vl9Xp11FFH6ac//akZFED2aW1t1f/93//pmmuu0emnn66SkhLNnj3bfKzt37//oNfR1dWlO++8U5/+9Ke1YsUKFRUVqaioSA0NDSosLNScOXP0yU9+Ups2bUrCTwSk3p/+9Cedfvrpys3NVW1trYqKilRfX6/Pf/7z6uzsTPXyYLFhwwbddNNN+vjHP66jjjpKxcXF5uvfxRdfnOrl4S327t2rm2++WZdffrkWL16svLw8lZaWqr6+Xvn5+VqyZIn+7d/+Tc3NzaleKiw2bNig//zP/9Q555yj2tpa5ebmqq6uTlVVVSosLNSaNWv04x//WCMjI6leKg6it7dXK1euNF8nV65cmeolYcymTZvGvYc61f8+97nPpXq5mMDLL7+sj33sY6qtrVVBQYHq6uqUm5urJUuW6Ctf+Ypef/31VC8x6/3oRz+a9vMs+r+vfOUrqV42FAmu/vKXv9TJJ5+swsJCVVVVqbGx0Xzf4qMf/aheffXVVC8zaRyGYRipXgQA+7nuuuv07W9/e9yfRQMknZ2dCgQCkiKfxPnv//5vffzjH0/FMpHBtmzZolWrVpmfsJakH/7wh/rXf/3XFK4KmSAYDOqzn/2sfvWrXyn6a1JeXp7Ky8vV29uroaEhSdJFF12ku+66K5VLhY1961vf0ne/+13zMeZwOFRdXa2enh6Njo6a551++um67777VFRUlKqlIk397ne/06WXXjruz/Ly8sw31R966CGdffbZ07qu/fv368wzzzTfbHK73aqoqFBnZ6cZGjnxxBP18MMP81jMQv/6r/+qG264wfza4XAoNzfX/B2stbX1oJ+8/8lPfqIvfvGL4/4sPz9fpaWl6uzsNF/3cnJy9J//+Z/6whe+EN8fAkgThmHo4x//uG655RZJkedTZWWlBgYGzOdUVVWVHn74Ya1atSqVS8WYxsZG7du3z/za+m/taaedpscffzxFK8NErrrqKv3iF78Y92dFRUUqLCxUR0eH+XtNcXGxbr31Vl144YWpWCbeYvny5XrjjTfMr3Nzc1VWVqauri7z/UVJmjdvnh588EEtXbo0FcvENFxyySX6/e9/b35dUlIy40/hIzE2bNhg/m5RWVk5ZfPfeeedpxtvvDFZS8NBGIaha665Rj/+8Y/NDxh5vV6Vl5ebTfCSdNZZZ+lvf/tbKpea9W644YZpPXfa29vN3/1vvPFGXX311YleGqawf/9+vetd79KLL75o/pnX61VxcbH2799vvnfrcrl0ww036POf/3yqlpo0NI8AOCzLly/XjTfeqJ07d2pwcFAtLS3q6+vTLbfcorKyMvl8Pl155ZV68MEHU71UZJBgMKjLLrtMPp9Pxx57bKqXgwxiGIYuuugi/fKXv5RhGLr44ov18ssva3h4WM3NzRocHNS2bdv0ve99T0cccUSqlwubuvfee/Wd73xHhmGopqZGv/vd7+Tz+dTW1qaRkRE988wzOvnkkyVJjz32mL70pS+leMVIRyUlJXr3u9+t6667Tvfff7/a29t1/fXXz/h6wuGwLrjgAr3++utyOp26/vrr1dvbq7a2NnV1denf/u3fJEXamD70oQ/F+8eADdTX1+sDH/iAfvCDH+if//ynent79b73ve+Qrmvx4sX6r//6L23dulVDQ0Pat2+f+vv7deedd6qmpkaBQEBf/OIXdeedd8b5pwDSw7e//W0zOHLBBReoqalJHR0dGhwc1O9//3sVFRVp//79Ouecc2ggSROrVq3Spz71Kf3qV7/Shg0b1N/fzwgNGzjuuOP061//Ws3Nzerv71dLS4t6enr005/+VPn5+erv79dFF12kF154IdVLhSL313e+8x09/vjj6uzslM/nU2trq3w+n1577TVddtllkqRdu3bpvPPOG/chIqSPe+65R7///e9VWVnJqJo0d+ONN6qpqWnS/xEcSS8f+9jHdMMNNygcDuv888/Xs88+q+HhYfO/pXbu3Kkf/ehHNP2kgS9/+ctTPreampq0detWc8Sw1+vVJZdckuJV48orrzSDI+985zu1YcMGDQ8Pq729XUNDQ/rFL36h8vJyhUIhffGLX9S6detSvOIkMADgENx2223G3XffPeU5zz77rOFyuQxJxooVK5K0MmSD66+/3pBkHHHEEcbdd99tSDIkGT/84Q9TvTTY3E9/+lPz8XT99denejnIUGeffbb5OHvssccmPGdkZMSYPXu2Icnwer3G8PBwchcJW/rhD39oPrYeeuihaV3m1ltvNS/zzW9+c8JzrrrqKvOcBx54IJ5Lhk195CMfMR8Tra2tBz3/j3/8o3H77bcb4XB40nM2btxo5ObmGpKM2bNnT3kuYEe7d+82H+Nr1qwxgsHgAefcd9995nPrc5/7XApWiemIvs9x2mmnpXopeIsbb7zReOSRR6Y8569//av5PHvHO96RpJXhcF1xxRXm/Xaw9yORfO3t7UZVVZUhybjjjjuMo446ypBklJSUpHppGPPKK6+Yz6E777wz1cvBNN12223m/falL30p1ctBHNxxxx3mfXrJJZekejlZr7W11XA4HIYkY8mSJcbIyMiE5z344IPm/XbZZZcleZXJR/MIgENy2WWXHfQThyeccILe/va3S5Jef/11tba2JmNpyHCvvPKKvvOd78jpdOo3v/mNcnNzU70kZIiBgQF94xvfkCStXbvWPAbibdeuXZIiFdqnnXbahOd4vV69853vlCT5fD61tLQkbX3ILv/7v/8rKVLfHm0ZeavrrrtOHo9n3PnATLz//e/XJZdcIofDMek5y5Yt03ve8x5J0p49e7Rly5YkrQ5Ijptvvll+v1+SdP3110/YXnH++efr+OOPlyTdcsstfLoemKGrr75a73jHO6Y859xzz9VRRx0l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cOCAsW9gYKAefvhh47HHH39cgwcPltVq1bJly3ThwgVVrFixUMdt0aKFtmzZIknatm0bxSMAANwgF7MDAAAAFIePPvpI+/btkySVKVNGkyZNUmJiolauXKklS5Zo//792rRpk6pVq6b9+/c77Lz2hRt33XVXofe7dOmSsdyNi4uLevbsmeNx+2KSBQsWKCMj4yaTFg8/Pz9VrVpVknTo0CGHdjUBAAAAAABFk5aWpt9++02tW7fWwYMHtXPnTn377bdauHChFi5cKD8/vyIf80bnPuwvmunZs6fKlClj3C5fvrw6dOgg6b/dYgurfv36xvauXbsKvR8AAMiJ4hEAAFAqTZ061dieMGGCRo4cKVfXnE3XHnjgAa1du1Y+Pj4OO298fLyxXdgrZCTpq6++MgotWrdurSpVquR4vEmTJqpXr54k6fTp00Yr1+IQHR1tTCKdOnVKkrR7927jvri4uHz3z37eNptNx48fL7acAAAAAACgYA0aNNDKlStVp04dhxzvRuY+MjMz9fnnnxu3/9pxVcpauiabfaFJQewz2GcDAABFQ/EIAAAodQ4dOmRMFgQHB+vFF1/Mc2zdunX1/PPPO+zc58+fN7aLUjxiPyliP1liz35ipSiTKEU1ZswY9e3bV3379tXOnTslSV9++aVxX2RkZL772z/vP/74o9hyAgAAAACAgr3++uvy8vJy2PFuZO5j7dq1OnHihCQpKChIDz744HVj/va3v8nb21tS1tI4Bw4cKNSxmYcAAMAxXAseAgAAcHv55ZdfjO2OHTte13Hkr7p06aIPP/zQIee2X6alfPnyhdrnyJEjxtq8rq6uCg8Pz3Vc3759NXbsWEnS0qVLdenSpRtqL1uQDh065Hs1UmhoaL772z/vP//801GxAAAAAADADWjXrp1Dj5c99+Hh4SFPT89C7WN/EUyvXr1ksViuG+Pj46POnTtr0aJFxj7jx48v8NjMQwAA4BgUjwAAgFLH/iqTWrVqFTi+du3aDju3u7u7sZ2cnFyofebNm2dsP/LII/L39891XP369XXvvfdqz549Sk1N1ddff62BAwfeXOBcjBs37qb2t3/e9n8fAAAAAADg1nJzc1NgYKBDj+nu7i6r1aq0tDRdu3atwIt2rly5om+//da4nduSNdn69OljFI98/vnnGjdunFxc8m+izzwEAACOQfEIAAAo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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "image/png": { + "height": 376, + "width": 1095 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "mv.prop.scattering(copper, level=\"amorphous\", source=\"amorphous_emt\",\n", + " q_max=12.0)\n", + "\n", + "q = mv.grid_of(copper, \"structure_factor\")\n", + "fig, axes = plt.subplots(1, 2, figsize=(11, 3.8))\n", + "axes[0].plot(q, copper.obsm[\"structure_factor_amorphous\"][0], linewidth=1.0)\n", + "axes[0].axhline(1.0, linestyle=\"--\", color=\"#888\", linewidth=0.8)\n", + "axes[0].set_xlabel(\"q (Å⁻¹)\"); axes[0].set_ylabel(\"S(q)\")\n", + "axes[0].set_title(\"structure factor\")\n", + "\n", + "r_pdf = mv.grid_of(copper, \"pdf\")\n", + "axes[1].plot(r_pdf, copper.obsm[\"pdf_amorphous\"][0], linewidth=1.0)\n", + "axes[1].axhline(0.0, linestyle=\"--\", color=\"#888\", linewidth=0.8)\n", + "axes[1].set_xlabel(\"r (Å)\"); axes[1].set_ylabel(\"G(r)\")\n", + "axes[1].set_title(\"reduced pair distribution\")\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "21d3fc7d", + "metadata": {}, + "source": [ + "Both are definitions rather than models:\n", + "\n", + "$$S(q) = 1 + \\frac{4\\pi\\rho}{q}\\int r\\,[g(r)-1]\\,\\sin(qr)\\,\\mathrm{d}r\n", + "\\qquad G(r) = 4\\pi r \\rho\\,[g(r)-1]$$\n", + "\n", + "which makes them checkable. For an ideal gas, g = 1 everywhere and S(q) comes\n", + "back as 1.000000 at every q; for a hard-sphere exclusion the transform has a\n", + "closed form and this reproduces it.\n", + "\n", + "```{warning}\n", + "**This is a technique for disordered matter, and applying it to a crystal\n", + "produces nonsense.** A crystal's g(r) never decays to one, so truncating it at\n", + "`r_max` and transforming produces termination ripple larger than any real peak\n", + "— on the four textbook structures in `mv.datasets` the apparent \"first peak\" of\n", + "S(q) is entirely ripple. `mv.prop.xrd` is the function for a crystalline\n", + "diffraction pattern.\n", + "\n", + "The accuracy also follows the r grid `mv.prop.rdf` produced, linearly: against\n", + "the hard-sphere closed form the error is 0.24 at a step of 0.10 Å, 0.12 at 0.05,\n", + "and 0.012 at 0.005. The default is fine for a shape and coarse for a comparison\n", + "against a measurement.\n", + "```\n", + "\n", + "## What the object remembers" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9bad3256", + "metadata": { + "execution": { + "iopub.execute_input": "2026-08-06T04:59:18.001896Z", + "iopub.status.busy": "2026-08-06T04:59:18.001794Z", + "iopub.status.idle": "2026-08-06T04:59:18.004041Z", + "shell.execute_reply": "2026-08-06T04:59:18.003666Z" } }, "outputs": [ @@ -974,7 +1058,8 @@ "md.run(level='emt', source='input', temperature=300.0, steps=2000, ensemble='nvt')\n", "md.conductivity(species='Cu', charge=1.0, level='emt', temperature=296.84706071763)\n", "md.melt_quench(level='emt', source='input', melt_temperature=2500.0, fixed_volume_quench=True)\n", - "prop.rdf(source='amorphous_emt', level='amorphous', r_max=8.0, sigma=0.1)\n" + "prop.rdf(source='amorphous_emt', level='amorphous', r_max=8.0, sigma=0.1)\n", + "prop.scattering(level='amorphous', quantity='rdf', q_max=12.0)\n" ] } ], @@ -985,7 +1070,7 @@ }, { "cell_type": "markdown", - "id": "6da60d48", + "id": "832765da", "metadata": {}, "source": [ "Every temperature, every step count, every thermostat setting. For MD that is\n", @@ -1001,7 +1086,7 @@ }, { "cell_type": "markdown", - "id": "1a590f0b", + "id": "59a7e184", "metadata": {}, "source": [ "## Where the atoms spend their time\n", @@ -1020,14 +1105,14 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "5635452f", + "execution_count": 17, + "id": "88dc9645", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.855221Z", - "iopub.status.busy": "2026-08-05T21:21:50.855094Z", - "iopub.status.idle": "2026-08-05T21:21:50.916856Z", - "shell.execute_reply": "2026-08-05T21:21:50.915467Z" + "iopub.execute_input": "2026-08-06T04:59:18.004789Z", + "iopub.status.busy": "2026-08-06T04:59:18.004701Z", + "iopub.status.idle": "2026-08-06T04:59:18.026071Z", + "shell.execute_reply": "2026-08-06T04:59:18.025702Z" } }, "outputs": [ @@ -1073,7 +1158,7 @@ "0 LiCl3 2.96 11.692" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1101,7 +1186,7 @@ }, { "cell_type": "markdown", - "id": "445a8687", + "id": "94e12751", "metadata": {}, "source": [ "The first peak lands at 2.96 Å against a nearest-neighbour distance of 2.97, and\n", @@ -1120,7 +1205,7 @@ }, { "cell_type": "markdown", - "id": "e54cecb2", + "id": "b0fc1628", "metadata": {}, "source": [ "## How much of the cell do they visit?\n", @@ -1136,14 +1221,14 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "04b760a9", + "execution_count": 18, + "id": "3f5b0a5d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.918094Z", - "iopub.status.busy": "2026-08-05T21:21:50.917963Z", - "iopub.status.idle": "2026-08-05T21:21:50.989108Z", - "shell.execute_reply": "2026-08-05T21:21:50.988574Z" + "iopub.execute_input": "2026-08-06T04:59:18.027067Z", + "iopub.status.busy": "2026-08-06T04:59:18.026956Z", + "iopub.status.idle": "2026-08-06T04:59:18.043535Z", + "shell.execute_reply": "2026-08-06T04:59:18.043262Z" } }, "outputs": [ @@ -1220,7 +1305,7 @@ "occupancy_entropy_liquid 0.9977" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1247,7 +1332,7 @@ }, { "cell_type": "markdown", - "id": "18bf76a5", + "id": "565b198a", "metadata": {}, "source": [ "Monotonic, from four ions pinned in four voxels to a liquid that has forgotten\n", @@ -1265,14 +1350,14 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "c92d9cda", + "execution_count": 19, + "id": "f29e44b1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.990152Z", - "iopub.status.busy": "2026-08-05T21:21:50.990029Z", - "iopub.status.idle": "2026-08-05T21:21:50.994700Z", - "shell.execute_reply": "2026-08-05T21:21:50.994267Z" + "iopub.execute_input": "2026-08-06T04:59:18.044532Z", + "iopub.status.busy": "2026-08-06T04:59:18.044375Z", + "iopub.status.idle": "2026-08-06T04:59:18.048103Z", + "shell.execute_reply": "2026-08-06T04:59:18.047836Z" } }, "outputs": [ @@ -1303,7 +1388,7 @@ }, { "cell_type": "markdown", - "id": "c508b7ed", + "id": "052a42d3", "metadata": {}, "source": [ "0.87 became 0.03 with no change to the physics. That is why the function warns\n", @@ -1317,7 +1402,7 @@ }, { "cell_type": "markdown", - "id": "bd5585fa", + "id": "eb2bf729", "metadata": {}, "source": [ "## The shape of the motion\n", @@ -1333,14 +1418,14 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "d29ccd57", + "execution_count": 20, + "id": "4713c252", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:50.995624Z", - "iopub.status.busy": "2026-08-05T21:21:50.995516Z", - "iopub.status.idle": "2026-08-05T21:21:52.376639Z", - "shell.execute_reply": "2026-08-05T21:21:52.376155Z" + "iopub.execute_input": "2026-08-06T04:59:18.048971Z", + "iopub.status.busy": "2026-08-06T04:59:18.048812Z", + "iopub.status.idle": "2026-08-06T04:59:18.790670Z", + "shell.execute_reply": "2026-08-06T04:59:18.788446Z" } }, "outputs": [ @@ -1381,7 +1466,7 @@ }, { "cell_type": "markdown", - "id": "4f00bacf", + "id": "c42a2562", "metadata": {}, "source": [ "Twelve, eighteen, fifty-four — the neighbour counts of a rocksalt lattice,\n", @@ -1398,14 +1483,14 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "1c0efce4", + "execution_count": 21, + "id": "259f89e5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:52.378023Z", - "iopub.status.busy": "2026-08-05T21:21:52.377843Z", - "iopub.status.idle": "2026-08-05T21:21:54.880439Z", - "shell.execute_reply": "2026-08-05T21:21:54.879663Z" + "iopub.execute_input": "2026-08-06T04:59:18.799782Z", + "iopub.status.busy": "2026-08-06T04:59:18.799637Z", + "iopub.status.idle": "2026-08-06T04:59:20.922886Z", + "shell.execute_reply": "2026-08-06T04:59:20.922148Z" } }, "outputs": [ @@ -1460,7 +1545,7 @@ "0 0.781 0.28 3.02 " ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -1485,7 +1570,7 @@ }, { "cell_type": "markdown", - "id": "a35d36be", + "id": "b234386c", "metadata": {}, "source": [ "Two things to read.\n", @@ -1509,7 +1594,7 @@ }, { "cell_type": "markdown", - "id": "dc739b98", + "id": "f2876ce2", "metadata": {}, "source": [ "## Rattling or hopping?\n", @@ -1527,14 +1612,14 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "bf1a0edd", + "execution_count": 22, + "id": "8858bfc1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:54.881619Z", - "iopub.status.busy": "2026-08-05T21:21:54.881495Z", - "iopub.status.idle": "2026-08-05T21:21:54.910237Z", - "shell.execute_reply": "2026-08-05T21:21:54.909950Z" + "iopub.execute_input": "2026-08-06T04:59:20.924535Z", + "iopub.status.busy": "2026-08-06T04:59:20.924319Z", + "iopub.status.idle": "2026-08-06T04:59:20.953461Z", + "shell.execute_reply": "2026-08-06T04:59:20.953082Z" } }, "outputs": [ @@ -1589,7 +1674,7 @@ "0 4 0.086 1.25 " ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1627,7 +1712,7 @@ }, { "cell_type": "markdown", - "id": "6a341574", + "id": "6c13c2fe", "metadata": {}, "source": [ "The vibration amplitude is unchanged between the two runs, because it *is*\n", diff --git a/matverse_guide/docs/tutorials/from_pymatgen.ipynb b/matverse_guide/docs/tutorials/from_pymatgen.ipynb index 01f152a..c1532a5 100644 --- a/matverse_guide/docs/tutorials/from_pymatgen.ipynb +++ b/matverse_guide/docs/tutorials/from_pymatgen.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0378a752", + "id": "229804f2", "metadata": {}, "source": [ "# Coming from pymatgen\n", @@ -36,13 +36,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "49e82fba", + "id": "b4298ebe", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:28.600729Z", - "iopub.status.busy": "2026-08-05T21:36:28.600631Z", - "iopub.status.idle": "2026-08-05T21:36:37.492369Z", - "shell.execute_reply": "2026-08-05T21:36:37.491878Z" + "iopub.execute_input": "2026-08-06T05:19:46.773006Z", + "iopub.status.busy": "2026-08-06T05:19:46.772921Z", + "iopub.status.idle": "2026-08-06T05:19:56.163116Z", + "shell.execute_reply": "2026-08-06T05:19:56.162569Z" } }, "outputs": [ @@ -86,7 +86,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -102,7 +102,7 @@ }, { "cell_type": "markdown", - "id": "52d67162", + "id": "441ca2bb", "metadata": {}, "source": [ "## Every transformation, by name\n", @@ -115,13 +115,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "40ca9859", + "id": "ee7a4c37", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:37.493645Z", - "iopub.status.busy": "2026-08-05T21:36:37.493277Z", - "iopub.status.idle": "2026-08-05T21:36:38.143268Z", - "shell.execute_reply": "2026-08-05T21:36:38.142745Z" + "iopub.execute_input": "2026-08-06T05:19:56.164639Z", + "iopub.status.busy": "2026-08-06T05:19:56.164105Z", + "iopub.status.idle": "2026-08-06T05:19:56.842952Z", + "shell.execute_reply": "2026-08-06T05:19:56.842621Z" } }, "outputs": [ @@ -144,13 +144,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "37bb9832", + "id": "1c8be972", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.144541Z", - "iopub.status.busy": "2026-08-05T21:36:38.144032Z", - "iopub.status.idle": "2026-08-05T21:36:38.151983Z", - "shell.execute_reply": "2026-08-05T21:36:38.151698Z" + "iopub.execute_input": "2026-08-06T05:19:56.844302Z", + "iopub.status.busy": "2026-08-06T05:19:56.843908Z", + "iopub.status.idle": "2026-08-06T05:19:56.851107Z", + "shell.execute_reply": "2026-08-06T05:19:56.850808Z" } }, "outputs": [ @@ -301,7 +301,7 @@ }, { "cell_type": "markdown", - "id": "1b3b962f", + "id": "0f9b94c2", "metadata": {}, "source": [ "Read from pymatgen at call time rather than from a table here, so a\n", @@ -313,13 +313,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "01bd6acb", + "id": "4127bbff", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.152739Z", - "iopub.status.busy": "2026-08-05T21:36:38.152597Z", - "iopub.status.idle": "2026-08-05T21:36:38.155971Z", - "shell.execute_reply": "2026-08-05T21:36:38.155728Z" + "iopub.execute_input": "2026-08-06T05:19:56.851991Z", + "iopub.status.busy": "2026-08-06T05:19:56.851903Z", + "iopub.status.idle": "2026-08-06T05:19:56.860454Z", + "shell.execute_reply": "2026-08-06T05:19:56.860170Z" } }, "outputs": [ @@ -340,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "e7cbf552", + "id": "12b057b8", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -351,13 +351,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "0e0e3332", + "id": "81539c25", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.157076Z", - "iopub.status.busy": "2026-08-05T21:36:38.156942Z", - "iopub.status.idle": "2026-08-05T21:36:38.195163Z", - "shell.execute_reply": "2026-08-05T21:36:38.194759Z" + "iopub.execute_input": "2026-08-06T05:19:56.861967Z", + "iopub.status.busy": "2026-08-06T05:19:56.861877Z", + "iopub.status.idle": "2026-08-06T05:19:56.913266Z", + "shell.execute_reply": "2026-08-06T05:19:56.912944Z" } }, "outputs": [ @@ -435,7 +435,7 @@ }, { "cell_type": "markdown", - "id": "9afef4e3", + "id": "596842bc", "metadata": {}, "source": [ "## Applying one" @@ -444,13 +444,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "dd3d88bd", + "id": "5c382c98", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.196037Z", - "iopub.status.busy": "2026-08-05T21:36:38.195885Z", - "iopub.status.idle": "2026-08-05T21:36:38.203793Z", - "shell.execute_reply": "2026-08-05T21:36:38.203520Z" + "iopub.execute_input": "2026-08-06T05:19:56.914249Z", + "iopub.status.busy": "2026-08-06T05:19:56.914146Z", + "iopub.status.idle": "2026-08-06T05:19:56.933568Z", + "shell.execute_reply": "2026-08-06T05:19:56.933253Z" } }, "outputs": [ @@ -474,7 +474,7 @@ }, { "cell_type": "markdown", - "id": "bdb59844", + "id": "4934973d", "metadata": {}, "source": [ "Three variants where a list comprehension would have left you with one list and\n", @@ -488,13 +488,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "2f807277", + "id": "19052c3e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.204563Z", - "iopub.status.busy": "2026-08-05T21:36:38.204421Z", - "iopub.status.idle": "2026-08-05T21:36:38.209083Z", - "shell.execute_reply": "2026-08-05T21:36:38.208824Z" + "iopub.execute_input": "2026-08-06T05:19:56.934488Z", + "iopub.status.busy": "2026-08-06T05:19:56.934393Z", + "iopub.status.idle": "2026-08-06T05:19:56.939295Z", + "shell.execute_reply": "2026-08-06T05:19:56.938956Z" } }, "outputs": [ @@ -569,7 +569,7 @@ }, { "cell_type": "markdown", - "id": "cd91bb95", + "id": "e7813fe6", "metadata": {}, "source": [ "### A failure on one row is not a failure of the call\n", @@ -582,13 +582,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "58876262", + "id": "3b2d9faa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.209782Z", - "iopub.status.busy": "2026-08-05T21:36:38.209647Z", - "iopub.status.idle": "2026-08-05T21:36:38.215084Z", - "shell.execute_reply": "2026-08-05T21:36:38.214834Z" + "iopub.execute_input": "2026-08-06T05:19:56.940138Z", + "iopub.status.busy": "2026-08-06T05:19:56.940040Z", + "iopub.status.idle": "2026-08-06T05:19:56.945801Z", + "shell.execute_reply": "2026-08-06T05:19:56.945530Z" } }, "outputs": [ @@ -664,13 +664,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "740008d4", + "id": "2e5db441", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.215796Z", - "iopub.status.busy": "2026-08-05T21:36:38.215661Z", - "iopub.status.idle": "2026-08-05T21:36:38.218053Z", - "shell.execute_reply": "2026-08-05T21:36:38.217760Z" + "iopub.execute_input": "2026-08-06T05:19:56.946615Z", + "iopub.status.busy": "2026-08-06T05:19:56.946480Z", + "iopub.status.idle": "2026-08-06T05:19:56.948474Z", + "shell.execute_reply": "2026-08-06T05:19:56.948228Z" } }, "outputs": [ @@ -691,7 +691,7 @@ }, { "cell_type": "markdown", - "id": "0f0cf910", + "id": "11515064", "metadata": {}, "source": [ "The rows that failed kept their original structure and are flagged `False`, so\n", @@ -705,13 +705,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "7228fd12", + "id": "98e70a7a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.218767Z", - "iopub.status.busy": "2026-08-05T21:36:38.218627Z", - "iopub.status.idle": "2026-08-05T21:36:38.220657Z", - "shell.execute_reply": "2026-08-05T21:36:38.220423Z" + "iopub.execute_input": "2026-08-06T05:19:56.949248Z", + "iopub.status.busy": "2026-08-06T05:19:56.949111Z", + "iopub.status.idle": "2026-08-06T05:19:56.951118Z", + "shell.execute_reply": "2026-08-06T05:19:56.950873Z" } }, "outputs": [ @@ -737,7 +737,7 @@ }, { "cell_type": "markdown", - "id": "3449f746", + "id": "b1fdd31f", "metadata": {}, "source": [ "## One-to-many\n", @@ -751,13 +751,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "b1c96dff", + "id": "f2b43aab", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.221343Z", - "iopub.status.busy": "2026-08-05T21:36:38.221203Z", - "iopub.status.idle": "2026-08-05T21:36:38.243343Z", - "shell.execute_reply": "2026-08-05T21:36:38.243051Z" + "iopub.execute_input": "2026-08-06T05:19:56.951918Z", + "iopub.status.busy": "2026-08-06T05:19:56.951774Z", + "iopub.status.idle": "2026-08-06T05:19:57.029706Z", + "shell.execute_reply": "2026-08-06T05:19:57.029372Z" } }, "outputs": [ @@ -844,7 +844,7 @@ }, { "cell_type": "markdown", - "id": "9f035590", + "id": "8d7cf844", "metadata": {}, "source": [ "```{note}\n", @@ -862,13 +862,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "79ea6328", + "id": "b4e455c4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.244109Z", - "iopub.status.busy": "2026-08-05T21:36:38.243974Z", - "iopub.status.idle": "2026-08-05T21:36:38.252236Z", - "shell.execute_reply": "2026-08-05T21:36:38.251927Z" + "iopub.execute_input": "2026-08-06T05:19:57.030490Z", + "iopub.status.busy": "2026-08-06T05:19:57.030395Z", + "iopub.status.idle": "2026-08-06T05:19:57.039250Z", + "shell.execute_reply": "2026-08-06T05:19:57.038968Z" } }, "outputs": [ @@ -941,13 +941,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "4468ed4e", + "id": "682037b4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.253016Z", - "iopub.status.busy": "2026-08-05T21:36:38.252870Z", - "iopub.status.idle": "2026-08-05T21:36:38.254979Z", - "shell.execute_reply": "2026-08-05T21:36:38.254729Z" + "iopub.execute_input": "2026-08-06T05:19:57.039982Z", + "iopub.status.busy": "2026-08-06T05:19:57.039846Z", + "iopub.status.idle": "2026-08-06T05:19:57.041922Z", + "shell.execute_reply": "2026-08-06T05:19:57.041678Z" } }, "outputs": [ @@ -970,7 +970,7 @@ }, { "cell_type": "markdown", - "id": "a4f6fc9b", + "id": "bec03529", "metadata": {}, "source": [ "One variant rather than one per step, because the intermediates are usually not\n", @@ -995,13 +995,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "e08d1b32", + "id": "ee78d601", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.255645Z", - "iopub.status.busy": "2026-08-05T21:36:38.255507Z", - "iopub.status.idle": "2026-08-05T21:36:38.281700Z", - "shell.execute_reply": "2026-08-05T21:36:38.281401Z" + "iopub.execute_input": "2026-08-06T05:19:57.042594Z", + "iopub.status.busy": "2026-08-06T05:19:57.042462Z", + "iopub.status.idle": "2026-08-06T05:19:57.065032Z", + "shell.execute_reply": "2026-08-06T05:19:57.064782Z" } }, "outputs": [ @@ -1079,13 +1079,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "8f726896", + "id": "3c70f868", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.282436Z", - "iopub.status.busy": "2026-08-05T21:36:38.282289Z", - "iopub.status.idle": "2026-08-05T21:36:38.285577Z", - "shell.execute_reply": "2026-08-05T21:36:38.285312Z" + "iopub.execute_input": "2026-08-06T05:19:57.065736Z", + "iopub.status.busy": "2026-08-06T05:19:57.065602Z", + "iopub.status.idle": "2026-08-06T05:19:57.068751Z", + "shell.execute_reply": "2026-08-06T05:19:57.068496Z" } }, "outputs": [ @@ -1107,7 +1107,7 @@ }, { "cell_type": "markdown", - "id": "f1b09fe4", + "id": "cbfb1ef9", "metadata": {}, "source": [ "Bond-valence analysis read the states off the bond lengths, and the cells came\n", @@ -1120,13 +1120,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "26c92876", + "id": "642b3c32", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.286268Z", - "iopub.status.busy": "2026-08-05T21:36:38.286119Z", - "iopub.status.idle": "2026-08-05T21:36:38.485801Z", - "shell.execute_reply": "2026-08-05T21:36:38.485425Z" + "iopub.execute_input": "2026-08-06T05:19:57.069447Z", + "iopub.status.busy": "2026-08-06T05:19:57.069315Z", + "iopub.status.idle": "2026-08-06T05:19:57.322946Z", + "shell.execute_reply": "2026-08-06T05:19:57.322486Z" } }, "outputs": [ @@ -1158,7 +1158,7 @@ }, { "cell_type": "markdown", - "id": "6cb9f6c8", + "id": "37ad7aa5", "metadata": {}, "source": [ "### It fails on metals, and says so per row\n", @@ -1171,13 +1171,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "c4593e6a", + "id": "99ee5858", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.486766Z", - "iopub.status.busy": "2026-08-05T21:36:38.486589Z", - "iopub.status.idle": "2026-08-05T21:36:38.538995Z", - "shell.execute_reply": "2026-08-05T21:36:38.538622Z" + "iopub.execute_input": "2026-08-06T05:19:57.324233Z", + "iopub.status.busy": "2026-08-06T05:19:57.324110Z", + "iopub.status.idle": "2026-08-06T05:19:57.371712Z", + "shell.execute_reply": "2026-08-06T05:19:57.371188Z" } }, "outputs": [ @@ -1243,13 +1243,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "e01778dc", + "id": "fe67e791", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.539954Z", - "iopub.status.busy": "2026-08-05T21:36:38.539774Z", - "iopub.status.idle": "2026-08-05T21:36:38.542120Z", - "shell.execute_reply": "2026-08-05T21:36:38.541837Z" + "iopub.execute_input": "2026-08-06T05:19:57.372950Z", + "iopub.status.busy": "2026-08-06T05:19:57.372730Z", + "iopub.status.idle": "2026-08-06T05:19:57.375562Z", + "shell.execute_reply": "2026-08-06T05:19:57.374887Z" } }, "outputs": [ @@ -1270,7 +1270,7 @@ }, { "cell_type": "markdown", - "id": "32d0c37f", + "id": "b99cdeea", "metadata": {}, "source": [ "## What you get for it\n", @@ -1305,13 +1305,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "d259d4e8", + "id": "397eef79", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.542968Z", - "iopub.status.busy": "2026-08-05T21:36:38.542814Z", - "iopub.status.idle": "2026-08-05T21:36:38.590599Z", - "shell.execute_reply": "2026-08-05T21:36:38.590217Z" + "iopub.execute_input": "2026-08-06T05:19:57.376640Z", + "iopub.status.busy": "2026-08-06T05:19:57.376520Z", + "iopub.status.idle": "2026-08-06T05:19:57.453820Z", + "shell.execute_reply": "2026-08-06T05:19:57.453336Z" } }, "outputs": [ @@ -1377,7 +1377,7 @@ }, { "cell_type": "markdown", - "id": "788a2e39", + "id": "4918d985", "metadata": {}, "source": [ "`a+b, a-b, c` is the one to look at: it doubles the volume and gives axes of\n", @@ -1409,13 +1409,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "9d7a1bce", + "id": "4a7ba06c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:38.591527Z", - "iopub.status.busy": "2026-08-05T21:36:38.591362Z", - "iopub.status.idle": "2026-08-05T21:36:39.093557Z", - "shell.execute_reply": "2026-08-05T21:36:39.093161Z" + "iopub.execute_input": "2026-08-06T05:19:57.454875Z", + "iopub.status.busy": "2026-08-06T05:19:57.454781Z", + "iopub.status.idle": "2026-08-06T05:19:57.890955Z", + "shell.execute_reply": "2026-08-06T05:19:57.890527Z" } }, "outputs": [ @@ -1490,7 +1490,7 @@ }, { "cell_type": "markdown", - "id": "55a5476f", + "id": "1aae1f99", "metadata": {}, "source": [ "| | matverse | α·e²/4πε₀r |\n", @@ -1518,13 +1518,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "402593a1", + "id": "2c7da1ac", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:39.094516Z", - "iopub.status.busy": "2026-08-05T21:36:39.094349Z", - "iopub.status.idle": "2026-08-05T21:36:39.096528Z", - "shell.execute_reply": "2026-08-05T21:36:39.096256Z" + "iopub.execute_input": "2026-08-06T05:19:57.892028Z", + "iopub.status.busy": "2026-08-06T05:19:57.891931Z", + "iopub.status.idle": "2026-08-06T05:19:57.893922Z", + "shell.execute_reply": "2026-08-06T05:19:57.893590Z" } }, "outputs": [ @@ -1551,7 +1551,7 @@ }, { "cell_type": "markdown", - "id": "50b132a0", + "id": "f1fc7c6b", "metadata": {}, "source": [ "## What matverse does not do\n", diff --git a/matverse_guide/docs/tutorials/getting_started.ipynb b/matverse_guide/docs/tutorials/getting_started.ipynb index df2406f..16e3aa0 100644 --- a/matverse_guide/docs/tutorials/getting_started.ipynb +++ b/matverse_guide/docs/tutorials/getting_started.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "87085ba5", + "id": "afdfe70c", "metadata": {}, "source": [ "# Screening real materials with matverse\n", @@ -25,13 +25,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "47947cf5", + "id": "261706a6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:31.651973Z", - "iopub.status.busy": "2026-08-05T21:17:31.651847Z", - "iopub.status.idle": "2026-08-05T21:17:45.198780Z", - "shell.execute_reply": "2026-08-05T21:17:45.197950Z" + "iopub.execute_input": "2026-08-06T04:53:48.242708Z", + "iopub.status.busy": "2026-08-06T04:53:48.242618Z", + "iopub.status.idle": "2026-08-06T04:53:58.254714Z", + "shell.execute_reply": "2026-08-06T04:53:58.254049Z" } }, "outputs": [ @@ -75,7 +75,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "d8319427", + "id": "7687ca91", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -120,13 +120,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "e0bb8aee", + "id": "c24b5864", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.201504Z", - "iopub.status.busy": "2026-08-05T21:17:45.200525Z", - "iopub.status.idle": "2026-08-05T21:17:45.206259Z", - "shell.execute_reply": "2026-08-05T21:17:45.205544Z" + "iopub.execute_input": "2026-08-06T04:53:58.256658Z", + "iopub.status.busy": "2026-08-06T04:53:58.256202Z", + "iopub.status.idle": "2026-08-06T04:53:58.259809Z", + "shell.execute_reply": "2026-08-06T04:53:58.259462Z" } }, "outputs": [ @@ -162,13 +162,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "87bb662b", + "id": "02e9b06d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.207492Z", - "iopub.status.busy": "2026-08-05T21:17:45.207330Z", - "iopub.status.idle": "2026-08-05T21:17:45.257911Z", - "shell.execute_reply": "2026-08-05T21:17:45.257468Z" + "iopub.execute_input": "2026-08-06T04:53:58.261115Z", + "iopub.status.busy": "2026-08-06T04:53:58.260965Z", + "iopub.status.idle": "2026-08-06T04:53:58.277789Z", + "shell.execute_reply": "2026-08-06T04:53:58.277483Z" } }, "outputs": [ @@ -195,7 +195,7 @@ }, { "cell_type": "markdown", - "id": "7f587a29", + "id": "3fa214da", "metadata": {}, "source": [ "`X` is the composition matrix and `var` is the periodic table. Neither was asked\n", @@ -210,13 +210,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "b5a637da", + "id": "9c65c1f3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.259046Z", - "iopub.status.busy": "2026-08-05T21:17:45.258908Z", - "iopub.status.idle": "2026-08-05T21:17:45.277795Z", - "shell.execute_reply": "2026-08-05T21:17:45.277302Z" + "iopub.execute_input": "2026-08-06T04:53:58.278779Z", + "iopub.status.busy": "2026-08-06T04:53:58.278615Z", + "iopub.status.idle": "2026-08-06T04:53:58.290492Z", + "shell.execute_reply": "2026-08-06T04:53:58.289876Z" } }, "outputs": [ @@ -310,13 +310,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "820a2255", + "id": "0cd66b67", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.278786Z", - "iopub.status.busy": "2026-08-05T21:17:45.278661Z", - "iopub.status.idle": "2026-08-05T21:17:45.285497Z", - "shell.execute_reply": "2026-08-05T21:17:45.285123Z" + "iopub.execute_input": "2026-08-06T04:53:58.291962Z", + "iopub.status.busy": "2026-08-06T04:53:58.291540Z", + "iopub.status.idle": "2026-08-06T04:53:58.299019Z", + "shell.execute_reply": "2026-08-06T04:53:58.298460Z" } }, "outputs": [ @@ -423,7 +423,7 @@ }, { "cell_type": "markdown", - "id": "fb2cba81", + "id": "058155f8", "metadata": {}, "source": [ "Because `var` is the periodic table, the natural display of anything\n", @@ -434,13 +434,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "aee4bc29", + "id": "adc2043b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:45.287218Z", - "iopub.status.busy": "2026-08-05T21:17:45.287035Z", - "iopub.status.idle": "2026-08-05T21:17:46.055109Z", - "shell.execute_reply": "2026-08-05T21:17:46.054666Z" + "iopub.execute_input": "2026-08-06T04:53:58.300322Z", + "iopub.status.busy": "2026-08-06T04:53:58.299926Z", + "iopub.status.idle": "2026-08-06T04:53:58.715432Z", + "shell.execute_reply": "2026-08-06T04:53:58.714789Z" } }, "outputs": [ @@ -479,7 +479,7 @@ }, { "cell_type": "markdown", - "id": "9d56e981", + "id": "7055c9d7", "metadata": {}, "source": [ "And you can just look at one, which catches the mistakes a number will not\n", @@ -490,13 +490,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "efb43367", + "id": "782f9703", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:46.058094Z", - "iopub.status.busy": "2026-08-05T21:17:46.057944Z", - "iopub.status.idle": "2026-08-05T21:17:46.548142Z", - "shell.execute_reply": "2026-08-05T21:17:46.547716Z" + "iopub.execute_input": "2026-08-06T04:53:58.716762Z", + "iopub.status.busy": "2026-08-06T04:53:58.716349Z", + "iopub.status.idle": "2026-08-06T04:53:58.971456Z", + "shell.execute_reply": "2026-08-06T04:53:58.970836Z" } }, "outputs": [ @@ -533,7 +533,7 @@ }, { "cell_type": "markdown", - "id": "7aa0a4ff", + "id": "ff4398b5", "metadata": {}, "source": [ "With `py3Dmol` installed the default backend is an interactive viewer instead.\n", @@ -553,13 +553,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "47c8f203", + "id": "faa84a1e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:46.549327Z", - "iopub.status.busy": "2026-08-05T21:17:46.549197Z", - "iopub.status.idle": "2026-08-05T21:17:47.022963Z", - "shell.execute_reply": "2026-08-05T21:17:47.022552Z" + "iopub.execute_input": "2026-08-06T04:53:58.972757Z", + "iopub.status.busy": "2026-08-06T04:53:58.972353Z", + "iopub.status.idle": "2026-08-06T04:53:59.204868Z", + "shell.execute_reply": "2026-08-06T04:53:59.204263Z" } }, "outputs": [ @@ -646,13 +646,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "4ad198be", + "id": "d27d91d0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:47.024013Z", - "iopub.status.busy": "2026-08-05T21:17:47.023894Z", - "iopub.status.idle": "2026-08-05T21:17:54.244593Z", - "shell.execute_reply": "2026-08-05T21:17:54.243568Z" + "iopub.execute_input": "2026-08-06T04:53:59.206337Z", + "iopub.status.busy": "2026-08-06T04:53:59.206154Z", + "iopub.status.idle": "2026-08-06T04:54:04.212251Z", + "shell.execute_reply": "2026-08-06T04:54:04.211746Z" } }, "outputs": [ @@ -729,13 +729,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "be0964e2", + "id": "c4569b35", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.245823Z", - "iopub.status.busy": "2026-08-05T21:17:54.245682Z", - "iopub.status.idle": "2026-08-05T21:17:54.782349Z", - "shell.execute_reply": "2026-08-05T21:17:54.781300Z" + "iopub.execute_input": "2026-08-06T04:54:04.214164Z", + "iopub.status.busy": "2026-08-06T04:54:04.213959Z", + "iopub.status.idle": "2026-08-06T04:54:05.021139Z", + "shell.execute_reply": "2026-08-06T04:54:05.020260Z" } }, "outputs": [ @@ -821,13 +821,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "e60da940", + "id": "13a6c10e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.783818Z", - "iopub.status.busy": "2026-08-05T21:17:54.783398Z", - "iopub.status.idle": "2026-08-05T21:17:54.793751Z", - "shell.execute_reply": "2026-08-05T21:17:54.793014Z" + "iopub.execute_input": "2026-08-06T04:54:05.022418Z", + "iopub.status.busy": "2026-08-06T04:54:05.022275Z", + "iopub.status.idle": "2026-08-06T04:54:05.032179Z", + "shell.execute_reply": "2026-08-06T04:54:05.031486Z" } }, "outputs": [ @@ -917,7 +917,7 @@ }, { "cell_type": "markdown", - "id": "74df756a", + "id": "8454a406", "metadata": {}, "source": [ "The cheapest possible statement about electronic structure: line up the atomic\n", @@ -944,7 +944,7 @@ }, { "cell_type": "markdown", - "id": "a6a7a547", + "id": "1532af49", "metadata": {}, "source": [ "`spacegroup` gives the symbol. This gives what the symbol *implies* — and\n", @@ -963,7 +963,7 @@ }, { "cell_type": "markdown", - "id": "bc3a71be", + "id": "d5a24e06", "metadata": {}, "source": [ "A space group says which symmetries a structure has. A **prototype** says which\n", @@ -982,7 +982,7 @@ }, { "cell_type": "markdown", - "id": "939fdfdf", + "id": "e53dfdb1", "metadata": {}, "source": [ "`spacegroup` is determined from the deposited coordinates, not copied from a\n", @@ -1004,13 +1004,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "4e26c596", + "id": "d042a098", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.795135Z", - "iopub.status.busy": "2026-08-05T21:17:54.794732Z", - "iopub.status.idle": "2026-08-05T21:17:54.930364Z", - "shell.execute_reply": "2026-08-05T21:17:54.929305Z" + "iopub.execute_input": "2026-08-06T04:54:05.033230Z", + "iopub.status.busy": "2026-08-06T04:54:05.033120Z", + "iopub.status.idle": "2026-08-06T04:54:05.094192Z", + "shell.execute_reply": "2026-08-06T04:54:05.093571Z" } }, "outputs": [ @@ -1034,13 +1034,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "7366accf", + "id": "187d7efe", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:54.931762Z", - "iopub.status.busy": "2026-08-05T21:17:54.931365Z", - "iopub.status.idle": "2026-08-05T21:17:55.221324Z", - "shell.execute_reply": "2026-08-05T21:17:55.220312Z" + "iopub.execute_input": "2026-08-06T04:54:05.095479Z", + "iopub.status.busy": "2026-08-06T04:54:05.095078Z", + "iopub.status.idle": "2026-08-06T04:54:05.241930Z", + "shell.execute_reply": "2026-08-06T04:54:05.241300Z" } }, "outputs": [ @@ -1077,7 +1077,7 @@ }, { "cell_type": "markdown", - "id": "05e45e62", + "id": "f9973ba3", "metadata": {}, "source": [ "LiFePO₄ and NaFePO₄ are the same framework with a different alkali, and the\n", @@ -1092,13 +1092,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "9c0f8384", + "id": "c97083a1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.222783Z", - "iopub.status.busy": "2026-08-05T21:17:55.222366Z", - "iopub.status.idle": "2026-08-05T21:17:55.230335Z", - "shell.execute_reply": "2026-08-05T21:17:55.229626Z" + "iopub.execute_input": "2026-08-06T04:54:05.243229Z", + "iopub.status.busy": "2026-08-06T04:54:05.242844Z", + "iopub.status.idle": "2026-08-06T04:54:05.250416Z", + "shell.execute_reply": "2026-08-06T04:54:05.249836Z" } }, "outputs": [ @@ -1172,7 +1172,7 @@ }, { "cell_type": "markdown", - "id": "bbb04369", + "id": "d10e3e20", "metadata": {}, "source": [ "Row 1 comes back at 1.00 and the runner-up at 0.06, which is the margin you want\n", @@ -1196,13 +1196,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "bb85f6ef", + "id": "00ae93b6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.231691Z", - "iopub.status.busy": "2026-08-05T21:17:55.231289Z", - "iopub.status.idle": "2026-08-05T21:17:55.235216Z", - "shell.execute_reply": "2026-08-05T21:17:55.234605Z" + "iopub.execute_input": "2026-08-06T04:54:05.251650Z", + "iopub.status.busy": "2026-08-06T04:54:05.251274Z", + "iopub.status.idle": "2026-08-06T04:54:05.254935Z", + "shell.execute_reply": "2026-08-06T04:54:05.254413Z" } }, "outputs": [ @@ -1229,7 +1229,7 @@ }, { "cell_type": "markdown", - "id": "9651ac93", + "id": "5e4d4b5a", "metadata": {}, "source": [ "ASE's effective-medium theory is the only calculator matverse ships working. It\n", @@ -1245,13 +1245,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "e670a138", + "id": "2f8219f5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.236527Z", - "iopub.status.busy": "2026-08-05T21:17:55.236127Z", - "iopub.status.idle": "2026-08-05T21:17:55.240457Z", - "shell.execute_reply": "2026-08-05T21:17:55.239842Z" + "iopub.execute_input": "2026-08-06T04:54:05.256162Z", + "iopub.status.busy": "2026-08-06T04:54:05.255793Z", + "iopub.status.idle": "2026-08-06T04:54:05.259868Z", + "shell.execute_reply": "2026-08-06T04:54:05.259348Z" } }, "outputs": [ @@ -1286,7 +1286,7 @@ }, { "cell_type": "markdown", - "id": "7e3238c0", + "id": "bca357b4", "metadata": {}, "source": [ "Registered, with its provenance attached — the method, the level of theory it\n", @@ -1300,13 +1300,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "9268b6d1", + "id": "1214639d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.241780Z", - "iopub.status.busy": "2026-08-05T21:17:55.241368Z", - "iopub.status.idle": "2026-08-05T21:17:55.267205Z", - "shell.execute_reply": "2026-08-05T21:17:55.266391Z" + "iopub.execute_input": "2026-08-06T04:54:05.261092Z", + "iopub.status.busy": "2026-08-06T04:54:05.260723Z", + "iopub.status.idle": "2026-08-06T04:54:05.273757Z", + "shell.execute_reply": "2026-08-06T04:54:05.273160Z" } }, "outputs": [ @@ -1398,7 +1398,7 @@ }, { "cell_type": "markdown", - "id": "4d283b8b", + "id": "db22af9a", "metadata": {}, "source": [ "Published room-temperature lattice parameters for the seven face-centred cubic\n", @@ -1408,13 +1408,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "ce09a53d", + "id": "39652021", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.268626Z", - "iopub.status.busy": "2026-08-05T21:17:55.268215Z", - "iopub.status.idle": "2026-08-05T21:17:55.730331Z", - "shell.execute_reply": "2026-08-05T21:17:55.729299Z" + "iopub.execute_input": "2026-08-06T04:54:05.275000Z", + "iopub.status.busy": "2026-08-06T04:54:05.274619Z", + "iopub.status.idle": "2026-08-06T04:54:05.534231Z", + "shell.execute_reply": "2026-08-06T04:54:05.521741Z" } }, "outputs": [ @@ -1517,13 +1517,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "3371e835", + "id": "96ad6a90", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.731730Z", - "iopub.status.busy": "2026-08-05T21:17:55.731313Z", - "iopub.status.idle": "2026-08-05T21:17:55.735184Z", - "shell.execute_reply": "2026-08-05T21:17:55.734501Z" + "iopub.execute_input": "2026-08-06T04:54:05.535608Z", + "iopub.status.busy": "2026-08-06T04:54:05.535466Z", + "iopub.status.idle": "2026-08-06T04:54:05.539254Z", + "shell.execute_reply": "2026-08-06T04:54:05.538617Z" } }, "outputs": [ @@ -1544,7 +1544,7 @@ }, { "cell_type": "markdown", - "id": "2ccb5d6b", + "id": "0db73b6b", "metadata": {}, "source": [ "The relaxed geometry becomes its own **variant** rather than replacing the\n", @@ -1560,13 +1560,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "5a3f1912", + "id": "bf997fd8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:55.736221Z", - "iopub.status.busy": "2026-08-05T21:17:55.736112Z", - "iopub.status.idle": "2026-08-05T21:17:56.467204Z", - "shell.execute_reply": "2026-08-05T21:17:56.466419Z" + "iopub.execute_input": "2026-08-06T04:54:05.540365Z", + "iopub.status.busy": "2026-08-06T04:54:05.540255Z", + "iopub.status.idle": "2026-08-06T04:54:05.900210Z", + "shell.execute_reply": "2026-08-06T04:54:05.899691Z" } }, "outputs": [ @@ -1695,7 +1695,7 @@ }, { "cell_type": "markdown", - "id": "4c8f87b8", + "id": "ad8d5d08", "metadata": {}, "source": [ "Worth comparing against measured values rather than accepting:\n", @@ -1739,20 +1739,20 @@ { "cell_type": "code", "execution_count": 21, - "id": "2d34a066", + "id": "62635ae2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:56.468622Z", - "iopub.status.busy": "2026-08-05T21:17:56.468187Z", - "iopub.status.idle": "2026-08-05T21:17:56.730361Z", - "shell.execute_reply": "2026-08-05T21:17:56.729306Z" + "iopub.execute_input": "2026-08-06T04:54:05.901411Z", + "iopub.status.busy": "2026-08-06T04:54:05.901307Z", + "iopub.status.idle": "2026-08-06T04:54:06.025344Z", + "shell.execute_reply": "2026-08-06T04:54:06.024543Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 21, @@ -1795,7 +1795,7 @@ }, { "cell_type": "markdown", - "id": "7fa7148e", + "id": "f014b154", "metadata": {}, "source": [ "Aluminium is the outlier, platinum is high, and the middle five track closely.\n", @@ -1814,13 +1814,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "625533c5", + "id": "90043071", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:56.731775Z", - "iopub.status.busy": "2026-08-05T21:17:56.731376Z", - "iopub.status.idle": "2026-08-05T21:17:57.032323Z", - "shell.execute_reply": "2026-08-05T21:17:57.031299Z" + "iopub.execute_input": "2026-08-06T04:54:06.027665Z", + "iopub.status.busy": "2026-08-06T04:54:06.027170Z", + "iopub.status.idle": "2026-08-06T04:54:06.180970Z", + "shell.execute_reply": "2026-08-06T04:54:06.180522Z" } }, "outputs": [ @@ -1960,7 +1960,7 @@ }, { "cell_type": "markdown", - "id": "3191ddfb", + "id": "9cb42810", "metadata": {}, "source": [ "### What those four numbers are hiding\n", @@ -1978,13 +1978,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "276398e9", + "id": "2c55cb15", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:57.033728Z", - "iopub.status.busy": "2026-08-05T21:17:57.033331Z", - "iopub.status.idle": "2026-08-05T21:17:58.096815Z", - "shell.execute_reply": "2026-08-05T21:17:58.095951Z" + "iopub.execute_input": "2026-08-06T04:54:06.188693Z", + "iopub.status.busy": "2026-08-06T04:54:06.188303Z", + "iopub.status.idle": "2026-08-06T04:54:06.695030Z", + "shell.execute_reply": "2026-08-06T04:54:06.694698Z" } }, "outputs": [ @@ -2016,7 +2016,7 @@ }, { "cell_type": "markdown", - "id": "5dc2489a", + "id": "4c7acfc1", "metadata": {}, "source": [ "The four-lobed shape is what a cubic crystal looks like: stiffest along the body\n", @@ -2066,13 +2066,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "8d40fe07", + "id": "32c40bab", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:58.097952Z", - "iopub.status.busy": "2026-08-05T21:17:58.097830Z", - "iopub.status.idle": "2026-08-05T21:17:58.380333Z", - "shell.execute_reply": "2026-08-05T21:17:58.379308Z" + "iopub.execute_input": "2026-08-06T04:54:06.696582Z", + "iopub.status.busy": "2026-08-06T04:54:06.696472Z", + "iopub.status.idle": "2026-08-06T04:54:06.829650Z", + "shell.execute_reply": "2026-08-06T04:54:06.829341Z" } }, "outputs": [ @@ -2111,7 +2111,7 @@ }, { "cell_type": "markdown", - "id": "8af9314b", + "id": "43bfff0d", "metadata": {}, "source": [ "## Off the zero-kelvin hull\n", @@ -2126,13 +2126,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "a3d3e856", + "id": "ec9a5cce", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:58.381738Z", - "iopub.status.busy": "2026-08-05T21:17:58.381339Z", - "iopub.status.idle": "2026-08-05T21:17:58.894358Z", - "shell.execute_reply": "2026-08-05T21:17:58.893305Z" + "iopub.execute_input": "2026-08-06T04:54:06.831187Z", + "iopub.status.busy": "2026-08-06T04:54:06.831059Z", + "iopub.status.idle": "2026-08-06T04:54:07.064618Z", + "shell.execute_reply": "2026-08-06T04:54:07.063990Z" } }, "outputs": [ @@ -2243,7 +2243,7 @@ }, { "cell_type": "markdown", - "id": "d798b601", + "id": "d205fbb5", "metadata": {}, "source": [ "| volumetric expansion, /K | matverse | experiment |\n", @@ -2276,13 +2276,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "2daf3b8d", + "id": "31bb8755", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:58.895836Z", - "iopub.status.busy": "2026-08-05T21:17:58.895419Z", - "iopub.status.idle": "2026-08-05T21:17:59.178723Z", - "shell.execute_reply": "2026-08-05T21:17:59.177902Z" + "iopub.execute_input": "2026-08-06T04:54:07.065696Z", + "iopub.status.busy": "2026-08-06T04:54:07.065576Z", + "iopub.status.idle": "2026-08-06T04:54:07.203810Z", + "shell.execute_reply": "2026-08-06T04:54:07.203328Z" } }, "outputs": [ @@ -2320,7 +2320,7 @@ }, { "cell_type": "markdown", - "id": "27825867", + "id": "869dbb97", "metadata": {}, "source": [ "The phonons are also everything thermodynamics needs. `mv.prop.free_energy`\n", @@ -2332,13 +2332,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "2331d3f4", + "id": "e289fd0f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:59.179831Z", - "iopub.status.busy": "2026-08-05T21:17:59.179716Z", - "iopub.status.idle": "2026-08-05T21:17:59.197333Z", - "shell.execute_reply": "2026-08-05T21:17:59.196300Z" + "iopub.execute_input": "2026-08-06T04:54:07.205296Z", + "iopub.status.busy": "2026-08-06T04:54:07.205176Z", + "iopub.status.idle": "2026-08-06T04:54:07.211990Z", + "shell.execute_reply": "2026-08-06T04:54:07.211467Z" } }, "outputs": [ @@ -2440,7 +2440,7 @@ }, { "cell_type": "markdown", - "id": "77321764", + "id": "ea9541fc", "metadata": {}, "source": [ "### The q-points a supercell cannot hold\n", @@ -2470,13 +2470,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "68724b92", + "id": "16368193", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:17:59.198799Z", - "iopub.status.busy": "2026-08-05T21:17:59.198372Z", - "iopub.status.idle": "2026-08-05T21:18:08.037997Z", - "shell.execute_reply": "2026-08-05T21:18:08.037162Z" + "iopub.execute_input": "2026-08-06T04:54:07.213071Z", + "iopub.status.busy": "2026-08-06T04:54:07.212890Z", + "iopub.status.idle": "2026-08-06T04:54:12.022349Z", + "shell.execute_reply": "2026-08-06T04:54:12.021472Z" } }, "outputs": [ @@ -2510,7 +2510,7 @@ }, { "cell_type": "markdown", - "id": "2db7f101", + "id": "80c4aa91", "metadata": {}, "source": [ "Interpolation is also the only way to get a *dispersion*. A supercell holds a\n", @@ -2526,13 +2526,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "afd97c88", + "id": "f421f2da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.039345Z", - "iopub.status.busy": "2026-08-05T21:18:08.039119Z", - "iopub.status.idle": "2026-08-05T21:18:08.464305Z", - "shell.execute_reply": "2026-08-05T21:18:08.463938Z" + "iopub.execute_input": "2026-08-06T04:54:12.023998Z", + "iopub.status.busy": "2026-08-06T04:54:12.023861Z", + "iopub.status.idle": "2026-08-06T04:54:12.456610Z", + "shell.execute_reply": "2026-08-06T04:54:12.456013Z" } }, "outputs": [ @@ -2570,7 +2570,7 @@ }, { "cell_type": "markdown", - "id": "8eb50411", + "id": "3f82ffbc", "metadata": {}, "source": [ "That is the check a hull cannot make, and the reason the two cells above are\n", @@ -2594,13 +2594,13 @@ { "cell_type": "code", "execution_count": 30, - "id": "4ec844aa", + "id": "564021a1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.465349Z", - "iopub.status.busy": "2026-08-05T21:18:08.465174Z", - "iopub.status.idle": "2026-08-05T21:18:08.721827Z", - "shell.execute_reply": "2026-08-05T21:18:08.721468Z" + "iopub.execute_input": "2026-08-06T04:54:12.457890Z", + "iopub.status.busy": "2026-08-06T04:54:12.457783Z", + "iopub.status.idle": "2026-08-06T04:54:12.845775Z", + "shell.execute_reply": "2026-08-06T04:54:12.845108Z" } }, "outputs": [ @@ -2636,7 +2636,7 @@ }, { "cell_type": "markdown", - "id": "ec1bd1c7", + "id": "8b4818ee", "metadata": {}, "source": [ "The dashed line at zero is where `mv.pl.bands` would normally draw the Fermi\n", @@ -2662,13 +2662,13 @@ { "cell_type": "code", "execution_count": 31, - "id": "b8ed923b", + "id": "5d609e24", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.723303Z", - "iopub.status.busy": "2026-08-05T21:18:08.723127Z", - "iopub.status.idle": "2026-08-05T21:18:08.737139Z", - "shell.execute_reply": "2026-08-05T21:18:08.736805Z" + "iopub.execute_input": "2026-08-06T04:54:12.847118Z", + "iopub.status.busy": "2026-08-06T04:54:12.847000Z", + "iopub.status.idle": "2026-08-06T04:54:12.870554Z", + "shell.execute_reply": "2026-08-06T04:54:12.869814Z" } }, "outputs": [ @@ -2705,7 +2705,7 @@ }, { "cell_type": "markdown", - "id": "191ac400", + "id": "3f3a54f1", "metadata": {}, "source": [ "The cell above prints a fallback rather than a table in the rendered docs,\n", @@ -2758,13 +2758,13 @@ { "cell_type": "code", "execution_count": 32, - "id": "82bbfc2a", + "id": "ce61d26a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.738142Z", - "iopub.status.busy": "2026-08-05T21:18:08.737984Z", - "iopub.status.idle": "2026-08-05T21:18:08.741215Z", - "shell.execute_reply": "2026-08-05T21:18:08.740909Z" + "iopub.execute_input": "2026-08-06T04:54:12.871725Z", + "iopub.status.busy": "2026-08-06T04:54:12.871609Z", + "iopub.status.idle": "2026-08-06T04:54:12.875703Z", + "shell.execute_reply": "2026-08-06T04:54:12.875260Z" } }, "outputs": [ @@ -2794,13 +2794,13 @@ { "cell_type": "code", "execution_count": 33, - "id": "0d0c8c05", + "id": "0125958c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.742192Z", - "iopub.status.busy": "2026-08-05T21:18:08.742036Z", - "iopub.status.idle": "2026-08-05T21:18:08.747750Z", - "shell.execute_reply": "2026-08-05T21:18:08.747434Z" + "iopub.execute_input": "2026-08-06T04:54:12.876614Z", + "iopub.status.busy": "2026-08-06T04:54:12.876497Z", + "iopub.status.idle": "2026-08-06T04:54:12.883097Z", + "shell.execute_reply": "2026-08-06T04:54:12.882651Z" } }, "outputs": [ @@ -2908,7 +2908,7 @@ }, { "cell_type": "markdown", - "id": "c1d2c192", + "id": "9cd81526", "metadata": {}, "source": [ "A threshold is a decision, and a table of seven rows does not show whether it\n", @@ -2921,13 +2921,13 @@ { "cell_type": "code", "execution_count": 34, - "id": "65a4c42d", + "id": "2910e586", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.748664Z", - "iopub.status.busy": "2026-08-05T21:18:08.748502Z", - "iopub.status.idle": "2026-08-05T21:18:08.867281Z", - "shell.execute_reply": "2026-08-05T21:18:08.866918Z" + "iopub.execute_input": "2026-08-06T04:54:12.884474Z", + "iopub.status.busy": "2026-08-06T04:54:12.884356Z", + "iopub.status.idle": "2026-08-06T04:54:13.000012Z", + "shell.execute_reply": "2026-08-06T04:54:12.999197Z" } }, "outputs": [ @@ -2964,7 +2964,7 @@ }, { "cell_type": "markdown", - "id": "4a2afb11", + "id": "8c653723", "metadata": {}, "source": [ "Subset when you actually want the short list — the object is an ordinary\n", @@ -2980,13 +2980,13 @@ { "cell_type": "code", "execution_count": 35, - "id": "1e1de20a", + "id": "d886e0f9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.868411Z", - "iopub.status.busy": "2026-08-05T21:18:08.868225Z", - "iopub.status.idle": "2026-08-05T21:18:08.880423Z", - "shell.execute_reply": "2026-08-05T21:18:08.880080Z" + "iopub.execute_input": "2026-08-06T04:54:13.001274Z", + "iopub.status.busy": "2026-08-06T04:54:13.001152Z", + "iopub.status.idle": "2026-08-06T04:54:13.015203Z", + "shell.execute_reply": "2026-08-06T04:54:13.014501Z" } }, "outputs": [ @@ -3104,7 +3104,7 @@ }, { "cell_type": "markdown", - "id": "0d160bce", + "id": "17bfb0b2", "metadata": {}, "source": [ "With seven elementals this is a formality. On a library of thousands it is the\n", @@ -3117,13 +3117,13 @@ { "cell_type": "code", "execution_count": 36, - "id": "06de8290", + "id": "8d1a6314", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.881453Z", - "iopub.status.busy": "2026-08-05T21:18:08.881291Z", - "iopub.status.idle": "2026-08-05T21:18:08.883443Z", - "shell.execute_reply": "2026-08-05T21:18:08.883165Z" + "iopub.execute_input": "2026-08-06T04:54:13.016413Z", + "iopub.status.busy": "2026-08-06T04:54:13.016296Z", + "iopub.status.idle": "2026-08-06T04:54:13.019229Z", + "shell.execute_reply": "2026-08-06T04:54:13.018655Z" } }, "outputs": [ @@ -3157,13 +3157,13 @@ { "cell_type": "code", "execution_count": 37, - "id": "c69b05cf", + "id": "7b497bef", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:08.884174Z", - "iopub.status.busy": "2026-08-05T21:18:08.884029Z", - "iopub.status.idle": "2026-08-05T21:18:09.123205Z", - "shell.execute_reply": "2026-08-05T21:18:09.122847Z" + "iopub.execute_input": "2026-08-06T04:54:13.020416Z", + "iopub.status.busy": "2026-08-06T04:54:13.020297Z", + "iopub.status.idle": "2026-08-06T04:54:13.263546Z", + "shell.execute_reply": "2026-08-06T04:54:13.262767Z" } }, "outputs": [ @@ -3189,7 +3189,7 @@ }, { "cell_type": "markdown", - "id": "2dcdd43a", + "id": "474b3a30", "metadata": {}, "source": [ "Parameters are recorded with each call, so the history replays as code rather\n", diff --git a/matverse_guide/docs/tutorials/infrastructure.ipynb b/matverse_guide/docs/tutorials/infrastructure.ipynb index d50ae72..c78d4a5 100644 --- a/matverse_guide/docs/tutorials/infrastructure.ipynb +++ b/matverse_guide/docs/tutorials/infrastructure.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ac08b1d1", + "id": "85713318", "metadata": {}, "source": [ "# Infrastructure\n", @@ -18,13 +18,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "1b29ec0a", + "id": "e2146f29", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:14.906582Z", - "iopub.status.busy": "2026-08-05T21:37:14.906461Z", - "iopub.status.idle": "2026-08-05T21:37:23.751382Z", - "shell.execute_reply": "2026-08-05T21:37:23.750841Z" + "iopub.execute_input": "2026-08-06T05:20:40.356610Z", + "iopub.status.busy": "2026-08-06T05:20:40.356519Z", + "iopub.status.idle": "2026-08-06T05:20:53.325849Z", + "shell.execute_reply": "2026-08-06T05:20:53.325104Z" } }, "outputs": [ @@ -68,7 +68,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,13 +85,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "f0130d95", + "id": "b8f96aae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.752911Z", - "iopub.status.busy": "2026-08-05T21:37:23.752308Z", - "iopub.status.idle": "2026-08-05T21:37:23.830122Z", - "shell.execute_reply": "2026-08-05T21:37:23.829678Z" + "iopub.execute_input": "2026-08-06T05:20:53.327959Z", + "iopub.status.busy": "2026-08-06T05:20:53.327511Z", + "iopub.status.idle": "2026-08-06T05:20:53.407883Z", + "shell.execute_reply": "2026-08-06T05:20:53.407529Z" } }, "outputs": [ @@ -186,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "7263567d", + "id": "52eb6688", "metadata": {}, "source": [ "## What is this object carrying?\n", @@ -198,13 +198,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "64088a4e", + "id": "899a89be", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.831002Z", - "iopub.status.busy": "2026-08-05T21:37:23.830907Z", - "iopub.status.idle": "2026-08-05T21:37:23.832987Z", - "shell.execute_reply": "2026-08-05T21:37:23.832627Z" + "iopub.execute_input": "2026-08-06T05:20:53.410109Z", + "iopub.status.busy": "2026-08-06T05:20:53.409959Z", + "iopub.status.idle": "2026-08-06T05:20:53.412185Z", + "shell.execute_reply": "2026-08-06T05:20:53.411909Z" } }, "outputs": [ @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "56cd4465", + "id": "aa0b21dd", "metadata": {}, "source": [ "## Units\n", @@ -243,13 +243,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "540924ae", + "id": "443c5b6d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.833711Z", - "iopub.status.busy": "2026-08-05T21:37:23.833622Z", - "iopub.status.idle": "2026-08-05T21:37:23.835804Z", - "shell.execute_reply": "2026-08-05T21:37:23.835460Z" + "iopub.execute_input": "2026-08-06T05:20:53.413777Z", + "iopub.status.busy": "2026-08-06T05:20:53.413656Z", + "iopub.status.idle": "2026-08-06T05:20:53.416367Z", + "shell.execute_reply": "2026-08-06T05:20:53.415833Z" } }, "outputs": [ @@ -281,13 +281,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "515c20cd", + "id": "a94123cf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.836528Z", - "iopub.status.busy": "2026-08-05T21:37:23.836435Z", - "iopub.status.idle": "2026-08-05T21:37:23.847659Z", - "shell.execute_reply": "2026-08-05T21:37:23.847260Z" + "iopub.execute_input": "2026-08-06T05:20:53.417513Z", + "iopub.status.busy": "2026-08-06T05:20:53.417401Z", + "iopub.status.idle": "2026-08-06T05:20:53.420373Z", + "shell.execute_reply": "2026-08-06T05:20:53.419907Z" } }, "outputs": [ @@ -317,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "003084dd", + "id": "e12b7dce", "metadata": {}, "source": [ "Every column matverse wrote has a unit; `lattice_parameter` and `nsites` come\n", @@ -328,13 +328,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "11c8b1d7", + "id": "27abcd70", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.848427Z", - "iopub.status.busy": "2026-08-05T21:37:23.848339Z", - "iopub.status.idle": "2026-08-05T21:37:23.851292Z", - "shell.execute_reply": "2026-08-05T21:37:23.850942Z" + "iopub.execute_input": "2026-08-06T05:20:53.421487Z", + "iopub.status.busy": "2026-08-06T05:20:53.421374Z", + "iopub.status.idle": "2026-08-06T05:20:53.426061Z", + "shell.execute_reply": "2026-08-06T05:20:53.425533Z" } }, "outputs": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "7c3aa11b", + "id": "09efb672", "metadata": {}, "source": [ "`mv.utils.convert` goes the other way — it takes a column in *someone else's*\n", @@ -371,13 +371,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "ddb09908", + "id": "8db00738", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.852037Z", - "iopub.status.busy": "2026-08-05T21:37:23.851945Z", - "iopub.status.idle": "2026-08-05T21:37:23.857890Z", - "shell.execute_reply": "2026-08-05T21:37:23.857534Z" + "iopub.execute_input": "2026-08-06T05:20:53.427153Z", + "iopub.status.busy": "2026-08-06T05:20:53.427022Z", + "iopub.status.idle": "2026-08-06T05:20:53.435276Z", + "shell.execute_reply": "2026-08-06T05:20:53.434676Z" } }, "outputs": [ @@ -490,7 +490,7 @@ }, { "cell_type": "markdown", - "id": "03d8aa29", + "id": "1d833dce", "metadata": {}, "source": [ "`reported_energy_ev` and `energy_per_atom_emt` agree, which is the check worth\n", @@ -506,13 +506,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "1d3145cf", + "id": "15b2e268", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.858613Z", - "iopub.status.busy": "2026-08-05T21:37:23.858524Z", - "iopub.status.idle": "2026-08-05T21:37:23.860566Z", - "shell.execute_reply": "2026-08-05T21:37:23.860253Z" + "iopub.execute_input": "2026-08-06T05:20:53.436280Z", + "iopub.status.busy": "2026-08-06T05:20:53.436157Z", + "iopub.status.idle": "2026-08-06T05:20:53.439692Z", + "shell.execute_reply": "2026-08-06T05:20:53.439153Z" } }, "outputs": [ @@ -533,7 +533,7 @@ }, { "cell_type": "markdown", - "id": "b80934e1", + "id": "f9431f7b", "metadata": {}, "source": [ "## Surviving a walltime limit\n", @@ -547,13 +547,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "8e2d7a95", + "id": "fc358b8e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.861253Z", - "iopub.status.busy": "2026-08-05T21:37:23.861164Z", - "iopub.status.idle": "2026-08-05T21:37:23.941155Z", - "shell.execute_reply": "2026-08-05T21:37:23.940625Z" + "iopub.execute_input": "2026-08-06T05:20:53.440747Z", + "iopub.status.busy": "2026-08-06T05:20:53.440633Z", + "iopub.status.idle": "2026-08-06T05:20:53.490102Z", + "shell.execute_reply": "2026-08-06T05:20:53.489357Z" } }, "outputs": [ @@ -579,7 +579,7 @@ }, { "cell_type": "markdown", - "id": "027d6d3f", + "id": "14490c78", "metadata": {}, "source": [ "`mv.utils.resume` answers the question a restarted job actually asks: *which\n", @@ -589,13 +589,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "5b51bac6", + "id": "0ee836da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:23.942326Z", - "iopub.status.busy": "2026-08-05T21:37:23.942185Z", - "iopub.status.idle": "2026-08-05T21:37:24.006100Z", - "shell.execute_reply": "2026-08-05T21:37:24.005575Z" + "iopub.execute_input": "2026-08-06T05:20:53.491254Z", + "iopub.status.busy": "2026-08-06T05:20:53.491122Z", + "iopub.status.idle": "2026-08-06T05:20:53.524064Z", + "shell.execute_reply": "2026-08-06T05:20:53.523321Z" } }, "outputs": [ @@ -622,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "0922b436", + "id": "11a4430c", "metadata": {}, "source": [ "Three rows were done before the job died; four remain. Note that this works on\n", @@ -646,13 +646,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "71817f0a", + "id": "dd3e0a1d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.007439Z", - "iopub.status.busy": "2026-08-05T21:37:24.007307Z", - "iopub.status.idle": "2026-08-05T21:37:24.033720Z", - "shell.execute_reply": "2026-08-05T21:37:24.033126Z" + "iopub.execute_input": "2026-08-06T05:20:53.525193Z", + "iopub.status.busy": "2026-08-06T05:20:53.525070Z", + "iopub.status.idle": "2026-08-06T05:20:53.541680Z", + "shell.execute_reply": "2026-08-06T05:20:53.541083Z" } }, "outputs": [ @@ -673,7 +673,7 @@ }, { "cell_type": "markdown", - "id": "40141187", + "id": "46d4f3de", "metadata": {}, "source": [ "`map_chunks` runs an operation over each piece, optionally checkpointing as it\n", @@ -684,13 +684,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "3b143c66", + "id": "49f14603", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.034831Z", - "iopub.status.busy": "2026-08-05T21:37:24.034698Z", - "iopub.status.idle": "2026-08-05T21:37:24.336167Z", - "shell.execute_reply": "2026-08-05T21:37:24.335552Z" + "iopub.execute_input": "2026-08-06T05:20:53.543014Z", + "iopub.status.busy": "2026-08-06T05:20:53.542610Z", + "iopub.status.idle": "2026-08-06T05:20:53.686941Z", + "shell.execute_reply": "2026-08-06T05:20:53.686331Z" } }, "outputs": [ @@ -721,13 +721,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "f9d7fbda", + "id": "4db6a055", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.337293Z", - "iopub.status.busy": "2026-08-05T21:37:24.337151Z", - "iopub.status.idle": "2026-08-05T21:37:24.342446Z", - "shell.execute_reply": "2026-08-05T21:37:24.341932Z" + "iopub.execute_input": "2026-08-06T05:20:53.688274Z", + "iopub.status.busy": "2026-08-06T05:20:53.687874Z", + "iopub.status.idle": "2026-08-06T05:20:53.694233Z", + "shell.execute_reply": "2026-08-06T05:20:53.693658Z" } }, "outputs": [ @@ -818,7 +818,7 @@ }, { "cell_type": "markdown", - "id": "8f02854f", + "id": "55288eec", "metadata": {}, "source": [ "The results landed on the parent object even though the work happened\n", @@ -834,13 +834,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "aeafba0a", + "id": "dd7a77dd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.343512Z", - "iopub.status.busy": "2026-08-05T21:37:24.343389Z", - "iopub.status.idle": "2026-08-05T21:37:24.346293Z", - "shell.execute_reply": "2026-08-05T21:37:24.345841Z" + "iopub.execute_input": "2026-08-06T05:20:53.695512Z", + "iopub.status.busy": "2026-08-06T05:20:53.695125Z", + "iopub.status.idle": "2026-08-06T05:20:53.698855Z", + "shell.execute_reply": "2026-08-06T05:20:53.698358Z" } }, "outputs": [ @@ -885,7 +885,7 @@ }, { "cell_type": "markdown", - "id": "0f3f7a77", + "id": "6dc0b675", "metadata": {}, "source": [ "### Submitting it\n", @@ -898,21 +898,21 @@ { "cell_type": "code", "execution_count": 15, - "id": "b0bfc68a", + "id": "d6982740", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.347250Z", - "iopub.status.busy": "2026-08-05T21:37:24.347133Z", - "iopub.status.idle": "2026-08-05T21:37:24.349823Z", - "shell.execute_reply": "2026-08-05T21:37:24.349381Z" + "iopub.execute_input": "2026-08-06T05:20:53.700083Z", + "iopub.status.busy": "2026-08-06T05:20:53.699705Z", + "iopub.status.idle": "2026-08-06T05:20:53.703269Z", + "shell.execute_reply": "2026-08-06T05:20:53.702750Z" } }, "outputs": [ { "data": { "text/plain": [ - "{'script': '/tmp/tmpixnb6qnq/screen.sbatch',\n", - " 'command': 'sbatch /tmp/tmpixnb6qnq/screen.sbatch',\n", + "{'script': '/tmp/tmp6j0gqlrh/screen.sbatch',\n", + " 'command': 'sbatch /tmp/tmp6j0gqlrh/screen.sbatch',\n", " 'job_id': None,\n", " 'state': 'dry run'}" ] @@ -929,7 +929,7 @@ }, { "cell_type": "markdown", - "id": "97a7e877", + "id": "7f3d88c7", "metadata": {}, "source": [ "`dry_run=True` returns the command without running it, which is what you want\n", @@ -943,21 +943,21 @@ { "cell_type": "code", "execution_count": 16, - "id": "af72ee06", + "id": "72a4f498", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.350761Z", - "iopub.status.busy": "2026-08-05T21:37:24.350647Z", - "iopub.status.idle": "2026-08-05T21:37:24.353180Z", - "shell.execute_reply": "2026-08-05T21:37:24.352755Z" + "iopub.execute_input": "2026-08-06T05:20:53.704489Z", + "iopub.status.busy": "2026-08-06T05:20:53.704111Z", + "iopub.status.idle": "2026-08-06T05:20:53.707579Z", + "shell.execute_reply": "2026-08-06T05:20:53.707073Z" } }, "outputs": [ { "data": { "text/plain": [ - "[{'script': '/tmp/tmpixnb6qnq/screen.sbatch',\n", - " 'command': 'sbatch /tmp/tmpixnb6qnq/screen.sbatch',\n", + "[{'script': '/tmp/tmp6j0gqlrh/screen.sbatch',\n", + " 'command': 'sbatch /tmp/tmp6j0gqlrh/screen.sbatch',\n", " 'job_id': None,\n", " 'state': 'dry run'}]" ] @@ -974,13 +974,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "e87f8d81", + "id": "4c80a081", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.354127Z", - "iopub.status.busy": "2026-08-05T21:37:24.354007Z", - "iopub.status.idle": "2026-08-05T21:37:24.356387Z", - "shell.execute_reply": "2026-08-05T21:37:24.356047Z" + "iopub.execute_input": "2026-08-06T05:20:53.708766Z", + "iopub.status.busy": "2026-08-06T05:20:53.708404Z", + "iopub.status.idle": "2026-08-06T05:20:53.711767Z", + "shell.execute_reply": "2026-08-06T05:20:53.711269Z" } }, "outputs": [ @@ -1003,7 +1003,7 @@ }, { "cell_type": "markdown", - "id": "6525d46d", + "id": "a870a8f4", "metadata": {}, "source": [ "With real submissions that reads `squeue`, and falls back to `sacct` for jobs\n", @@ -1032,13 +1032,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "7667522f", + "id": "0ac925fb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.357570Z", - "iopub.status.busy": "2026-08-05T21:37:24.357464Z", - "iopub.status.idle": "2026-08-05T21:37:24.360119Z", - "shell.execute_reply": "2026-08-05T21:37:24.359706Z" + "iopub.execute_input": "2026-08-06T05:20:53.712954Z", + "iopub.status.busy": "2026-08-06T05:20:53.712587Z", + "iopub.status.idle": "2026-08-06T05:20:53.716226Z", + "shell.execute_reply": "2026-08-06T05:20:53.715722Z" } }, "outputs": [ @@ -1077,13 +1077,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "8a7d10cc", + "id": "349e2377", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.361067Z", - "iopub.status.busy": "2026-08-05T21:37:24.360961Z", - "iopub.status.idle": "2026-08-05T21:37:24.973727Z", - "shell.execute_reply": "2026-08-05T21:37:24.973299Z" + "iopub.execute_input": "2026-08-06T05:20:53.717403Z", + "iopub.status.busy": "2026-08-06T05:20:53.717033Z", + "iopub.status.idle": "2026-08-06T05:20:53.980871Z", + "shell.execute_reply": "2026-08-06T05:20:53.980263Z" } }, "outputs": [ @@ -1108,13 +1108,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "1d7bc5d7", + "id": "30234a76", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.980198Z", - "iopub.status.busy": "2026-08-05T21:37:24.979729Z", - "iopub.status.idle": "2026-08-05T21:37:24.993954Z", - "shell.execute_reply": "2026-08-05T21:37:24.993498Z" + "iopub.execute_input": "2026-08-06T05:20:53.982502Z", + "iopub.status.busy": "2026-08-06T05:20:53.981785Z", + "iopub.status.idle": "2026-08-06T05:20:53.985922Z", + "shell.execute_reply": "2026-08-06T05:20:53.985418Z" } }, "outputs": [ @@ -1135,7 +1135,7 @@ }, { "cell_type": "markdown", - "id": "9a8ce2cb", + "id": "61472a1b", "metadata": {}, "source": [ "INCAR, POSCAR, KPOINTS and a POTCAR *specification* — the last is a list of\n", @@ -1148,20 +1148,20 @@ { "cell_type": "code", "execution_count": 21, - "id": "7fb351eb", + "id": "0ee4b32e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.994915Z", - "iopub.status.busy": "2026-08-05T21:37:24.994799Z", - "iopub.status.idle": "2026-08-05T21:37:24.998169Z", - "shell.execute_reply": "2026-08-05T21:37:24.997690Z" + "iopub.execute_input": "2026-08-06T05:20:53.987134Z", + "iopub.status.busy": "2026-08-06T05:20:53.986768Z", + "iopub.status.idle": "2026-08-06T05:20:53.990764Z", + "shell.execute_reply": "2026-08-06T05:20:53.990255Z" } }, "outputs": [ { "data": { "text/plain": [ - "{'root': '/tmp/tmpixnb6qnq/runs',\n", + "{'root': '/tmp/tmp6j0gqlrh/runs',\n", " 'n_total': 2,\n", " 'n_finished': 0,\n", " 'n_missing': 2,\n", @@ -1180,7 +1180,7 @@ }, { "cell_type": "markdown", - "id": "0ed283ad", + "id": "0071a6af", "metadata": {}, "source": [ "Nothing has run, so both are missing. Pretend one finished:" @@ -1189,20 +1189,20 @@ { "cell_type": "code", "execution_count": 22, - "id": "21f29869", + "id": "3f4584ba", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:24.999227Z", - "iopub.status.busy": "2026-08-05T21:37:24.999107Z", - "iopub.status.idle": "2026-08-05T21:37:25.002196Z", - "shell.execute_reply": "2026-08-05T21:37:25.001787Z" + "iopub.execute_input": "2026-08-06T05:20:53.991993Z", + "iopub.status.busy": "2026-08-06T05:20:53.991598Z", + "iopub.status.idle": "2026-08-06T05:20:53.995489Z", + "shell.execute_reply": "2026-08-06T05:20:53.994985Z" } }, "outputs": [ { "data": { "text/plain": [ - "{'root': '/tmp/tmpixnb6qnq/runs',\n", + "{'root': '/tmp/tmp6j0gqlrh/runs',\n", " 'n_total': 2,\n", " 'n_finished': 1,\n", " 'n_missing': 1,\n", @@ -1222,7 +1222,7 @@ }, { "cell_type": "markdown", - "id": "c9753042", + "id": "35c69254", "metadata": {}, "source": [ "```{note}\n", @@ -1240,13 +1240,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "afd29fdb", + "id": "06afa23e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.003121Z", - "iopub.status.busy": "2026-08-05T21:37:25.003012Z", - "iopub.status.idle": "2026-08-05T21:37:25.011233Z", - "shell.execute_reply": "2026-08-05T21:37:25.010752Z" + "iopub.execute_input": "2026-08-06T05:20:53.996693Z", + "iopub.status.busy": "2026-08-06T05:20:53.996318Z", + "iopub.status.idle": "2026-08-06T05:20:54.006168Z", + "shell.execute_reply": "2026-08-06T05:20:54.005625Z" } }, "outputs": [ @@ -1312,7 +1312,7 @@ }, { "cell_type": "markdown", - "id": "4ce98463", + "id": "90300bb7", "metadata": {}, "source": [ "Both are NaN with a reason, because the `` above is not a real\n", @@ -1327,13 +1327,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "0a9aa99e", + "id": "f204e45e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.012370Z", - "iopub.status.busy": "2026-08-05T21:37:25.012173Z", - "iopub.status.idle": "2026-08-05T21:37:25.026925Z", - "shell.execute_reply": "2026-08-05T21:37:25.026305Z" + "iopub.execute_input": "2026-08-06T05:20:54.007427Z", + "iopub.status.busy": "2026-08-06T05:20:54.007023Z", + "iopub.status.idle": "2026-08-06T05:20:54.012255Z", + "shell.execute_reply": "2026-08-06T05:20:54.011725Z" } }, "outputs": [ @@ -1366,7 +1366,7 @@ }, { "cell_type": "markdown", - "id": "ad19d67b", + "id": "df710cb9", "metadata": {}, "source": [ "`read_dos` fills the density of states onto the shared energy grid, and derives\n", @@ -1387,13 +1387,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "2375298d", + "id": "fe1a412f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.028014Z", - "iopub.status.busy": "2026-08-05T21:37:25.027879Z", - "iopub.status.idle": "2026-08-05T21:37:25.030464Z", - "shell.execute_reply": "2026-08-05T21:37:25.030036Z" + "iopub.execute_input": "2026-08-06T05:20:54.013474Z", + "iopub.status.busy": "2026-08-06T05:20:54.013091Z", + "iopub.status.idle": "2026-08-06T05:20:54.016449Z", + "shell.execute_reply": "2026-08-06T05:20:54.015943Z" } }, "outputs": [ @@ -1415,13 +1415,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "7eb9b53a", + "id": "485647fd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:37:25.031676Z", - "iopub.status.busy": "2026-08-05T21:37:25.031559Z", - "iopub.status.idle": "2026-08-05T21:37:25.033937Z", - "shell.execute_reply": "2026-08-05T21:37:25.033568Z" + "iopub.execute_input": "2026-08-06T05:20:54.017643Z", + "iopub.status.busy": "2026-08-06T05:20:54.017276Z", + "iopub.status.idle": "2026-08-06T05:20:54.020521Z", + "shell.execute_reply": "2026-08-06T05:20:54.020030Z" } }, "outputs": [ @@ -1442,7 +1442,7 @@ }, { "cell_type": "markdown", - "id": "7ffd17e7", + "id": "d890b923", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/interfaces.ipynb b/matverse_guide/docs/tutorials/interfaces.ipynb index 97d170e..88736a6 100644 --- a/matverse_guide/docs/tutorials/interfaces.ipynb +++ b/matverse_guide/docs/tutorials/interfaces.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "52e88f22", + "id": "146f1880", "metadata": {}, "source": [ "# Interfaces\n", @@ -28,13 +28,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "29d83fcc", + "id": "ad7d726f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:19.206956Z", - "iopub.status.busy": "2026-08-05T21:35:19.206865Z", - "iopub.status.idle": "2026-08-05T21:35:24.571622Z", - "shell.execute_reply": "2026-08-05T21:35:24.571133Z" + "iopub.execute_input": "2026-08-06T05:17:38.370981Z", + "iopub.status.busy": "2026-08-06T05:17:38.370890Z", + "iopub.status.idle": "2026-08-06T05:17:43.832627Z", + "shell.execute_reply": "2026-08-06T05:17:43.832083Z" } }, "outputs": [ @@ -78,7 +78,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -94,7 +94,7 @@ }, { "cell_type": "markdown", - "id": "461bbae5", + "id": "67ee0305", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -107,13 +107,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "65a2f9e0", + "id": "e344994f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:24.572809Z", - "iopub.status.busy": "2026-08-05T21:35:24.572449Z", - "iopub.status.idle": "2026-08-05T21:35:24.598391Z", - "shell.execute_reply": "2026-08-05T21:35:24.597998Z" + "iopub.execute_input": "2026-08-06T05:17:43.834465Z", + "iopub.status.busy": "2026-08-06T05:17:43.834041Z", + "iopub.status.idle": "2026-08-06T05:17:43.862086Z", + "shell.execute_reply": "2026-08-06T05:17:43.861626Z" } }, "outputs": [ @@ -188,7 +188,7 @@ }, { "cell_type": "markdown", - "id": "c03faf1d", + "id": "b8b488c9", "metadata": {}, "source": [ "## Will the lattices match?\n", @@ -202,13 +202,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "bf9675a8", + "id": "0bb60e9b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:24.599371Z", - "iopub.status.busy": "2026-08-05T21:35:24.599276Z", - "iopub.status.idle": "2026-08-05T21:35:25.350663Z", - "shell.execute_reply": "2026-08-05T21:35:25.350148Z" + "iopub.execute_input": "2026-08-06T05:17:43.863196Z", + "iopub.status.busy": "2026-08-06T05:17:43.863074Z", + "iopub.status.idle": "2026-08-06T05:17:44.641237Z", + "shell.execute_reply": "2026-08-06T05:17:44.640717Z" } }, "outputs": [ @@ -234,13 +234,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "0ab4b7d7", + "id": "adf75215", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.352152Z", - "iopub.status.busy": "2026-08-05T21:35:25.351582Z", - "iopub.status.idle": "2026-08-05T21:35:25.359633Z", - "shell.execute_reply": "2026-08-05T21:35:25.359296Z" + "iopub.execute_input": "2026-08-06T05:17:44.643297Z", + "iopub.status.busy": "2026-08-06T05:17:44.642535Z", + "iopub.status.idle": "2026-08-06T05:17:44.651747Z", + "shell.execute_reply": "2026-08-06T05:17:44.651053Z" } }, "outputs": [ @@ -376,7 +376,7 @@ }, { "cell_type": "markdown", - "id": "bdfe1a4d", + "id": "8e38b3ee", "metadata": {}, "source": [ "Six rows for three materials: the pairing is **ordered**, because copper grown\n", @@ -395,20 +395,20 @@ { "cell_type": "code", "execution_count": 5, - "id": "decd2949", + "id": "331e0ff1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.360409Z", - "iopub.status.busy": "2026-08-05T21:35:25.360316Z", - "iopub.status.idle": "2026-08-05T21:35:25.482672Z", - "shell.execute_reply": "2026-08-05T21:35:25.482244Z" + "iopub.execute_input": "2026-08-06T05:17:44.652918Z", + "iopub.status.busy": "2026-08-06T05:17:44.652773Z", + "iopub.status.idle": "2026-08-06T05:17:44.779439Z", + "shell.execute_reply": "2026-08-06T05:17:44.778753Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -448,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "6d01328e", + "id": "45579a6d", "metadata": {}, "source": [ "Tighten the threshold and the screen starts discriminating — which is the\n", @@ -458,13 +458,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "f8a57a9a", + "id": "3bc3340e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.483579Z", - "iopub.status.busy": "2026-08-05T21:35:25.483471Z", - "iopub.status.idle": "2026-08-05T21:35:25.742873Z", - "shell.execute_reply": "2026-08-05T21:35:25.742450Z" + "iopub.execute_input": "2026-08-06T05:17:44.780624Z", + "iopub.status.busy": "2026-08-06T05:17:44.780474Z", + "iopub.status.idle": "2026-08-06T05:17:45.041534Z", + "shell.execute_reply": "2026-08-06T05:17:45.040888Z" } }, "outputs": [ @@ -564,7 +564,7 @@ }, { "cell_type": "markdown", - "id": "b07e37e0", + "id": "5e8ac8dc", "metadata": {}, "source": [ "## What happens at the contact?\n", @@ -580,13 +580,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "59437b91", + "id": "0dbbb5f4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.743761Z", - "iopub.status.busy": "2026-08-05T21:35:25.743666Z", - "iopub.status.idle": "2026-08-05T21:35:25.950738Z", - "shell.execute_reply": "2026-08-05T21:35:25.950351Z" + "iopub.execute_input": "2026-08-06T05:17:45.042699Z", + "iopub.status.busy": "2026-08-06T05:17:45.042581Z", + "iopub.status.idle": "2026-08-06T05:17:45.250003Z", + "shell.execute_reply": "2026-08-06T05:17:45.249544Z" } }, "outputs": [ @@ -687,7 +687,7 @@ }, { "cell_type": "markdown", - "id": "b7cf60fd", + "id": "7d97b4c6", "metadata": {}, "source": [ "All zero, and that is the correct answer for this dataset rather than a\n", @@ -703,13 +703,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "7bbd6d67", + "id": "72611851", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.951719Z", - "iopub.status.busy": "2026-08-05T21:35:25.951622Z", - "iopub.status.idle": "2026-08-05T21:35:25.968148Z", - "shell.execute_reply": "2026-08-05T21:35:25.967777Z" + "iopub.execute_input": "2026-08-06T05:17:45.251373Z", + "iopub.status.busy": "2026-08-06T05:17:45.251237Z", + "iopub.status.idle": "2026-08-06T05:17:45.269092Z", + "shell.execute_reply": "2026-08-06T05:17:45.268368Z" } }, "outputs": [ @@ -793,13 +793,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "b91f087d", + "id": "7115cfeb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:25.969103Z", - "iopub.status.busy": "2026-08-05T21:35:25.969007Z", - "iopub.status.idle": "2026-08-05T21:35:26.221885Z", - "shell.execute_reply": "2026-08-05T21:35:26.221278Z" + "iopub.execute_input": "2026-08-06T05:17:45.270374Z", + "iopub.status.busy": "2026-08-06T05:17:45.270233Z", + "iopub.status.idle": "2026-08-06T05:17:45.523418Z", + "shell.execute_reply": "2026-08-06T05:17:45.522922Z" } }, "outputs": [ @@ -909,7 +909,7 @@ }, { "cell_type": "markdown", - "id": "66267ce1", + "id": "69347f42", "metadata": {}, "source": [ "**Ni + 3 Al → Al₃Ni at −0.45 eV/atom.** Put aluminium against nickel and it\n", @@ -937,13 +937,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "8d4d309a", + "id": "ba3c1d5b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:26.222959Z", - "iopub.status.busy": "2026-08-05T21:35:26.222833Z", - "iopub.status.idle": "2026-08-05T21:35:29.108653Z", - "shell.execute_reply": "2026-08-05T21:35:29.108177Z" + "iopub.execute_input": "2026-08-06T05:17:45.524651Z", + "iopub.status.busy": "2026-08-06T05:17:45.524517Z", + "iopub.status.idle": "2026-08-06T05:17:48.472263Z", + "shell.execute_reply": "2026-08-06T05:17:48.471300Z" } }, "outputs": [ @@ -1013,13 +1013,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "22920d23", + "id": "53a9b59e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.109598Z", - "iopub.status.busy": "2026-08-05T21:35:29.109491Z", - "iopub.status.idle": "2026-08-05T21:35:29.111956Z", - "shell.execute_reply": "2026-08-05T21:35:29.111646Z" + "iopub.execute_input": "2026-08-06T05:17:48.474620Z", + "iopub.status.busy": "2026-08-06T05:17:48.474428Z", + "iopub.status.idle": "2026-08-06T05:17:48.479955Z", + "shell.execute_reply": "2026-08-06T05:17:48.479070Z" } }, "outputs": [ @@ -1046,7 +1046,7 @@ }, { "cell_type": "markdown", - "id": "61314fcc", + "id": "7550a1dc", "metadata": {}, "source": [ "One cell per **termination**. Cutting the same orientation at a different plane\n", @@ -1062,13 +1062,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "c7f23eb8", + "id": "7616fc39", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.112660Z", - "iopub.status.busy": "2026-08-05T21:35:29.112573Z", - "iopub.status.idle": "2026-08-05T21:35:29.114773Z", - "shell.execute_reply": "2026-08-05T21:35:29.114473Z" + "iopub.execute_input": "2026-08-06T05:17:48.481274Z", + "iopub.status.busy": "2026-08-06T05:17:48.481104Z", + "iopub.status.idle": "2026-08-06T05:17:48.485842Z", + "shell.execute_reply": "2026-08-06T05:17:48.485121Z" } }, "outputs": [ @@ -1090,13 +1090,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "3c0881f6", + "id": "fff20475", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.115465Z", - "iopub.status.busy": "2026-08-05T21:35:29.115382Z", - "iopub.status.idle": "2026-08-05T21:35:29.211455Z", - "shell.execute_reply": "2026-08-05T21:35:29.211053Z" + "iopub.execute_input": "2026-08-06T05:17:48.486972Z", + "iopub.status.busy": "2026-08-06T05:17:48.486834Z", + "iopub.status.idle": "2026-08-06T05:17:49.901874Z", + "shell.execute_reply": "2026-08-06T05:17:49.901096Z" } }, "outputs": [ @@ -1156,7 +1156,7 @@ }, { "cell_type": "markdown", - "id": "601faf15", + "id": "27e24e3c", "metadata": {}, "source": [ "```{note}\n", @@ -1176,13 +1176,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "78eab297", + "id": "bef41f08", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.212274Z", - "iopub.status.busy": "2026-08-05T21:35:29.212180Z", - "iopub.status.idle": "2026-08-05T21:35:29.217722Z", - "shell.execute_reply": "2026-08-05T21:35:29.217423Z" + "iopub.execute_input": "2026-08-06T05:17:49.903111Z", + "iopub.status.busy": "2026-08-06T05:17:49.902992Z", + "iopub.status.idle": "2026-08-06T05:17:49.910393Z", + "shell.execute_reply": "2026-08-06T05:17:49.909951Z" } }, "outputs": [ @@ -1292,7 +1292,7 @@ }, { "cell_type": "markdown", - "id": "b32e00f0", + "id": "e1daf881", "metadata": {}, "source": [ "A pairing is usable when the lattices fit *and* the contact is inert. Neither\n", @@ -1304,13 +1304,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "b2322cf5", + "id": "ecd309b3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:29.218459Z", - "iopub.status.busy": "2026-08-05T21:35:29.218372Z", - "iopub.status.idle": "2026-08-05T21:35:29.220343Z", - "shell.execute_reply": "2026-08-05T21:35:29.220026Z" + "iopub.execute_input": "2026-08-06T05:17:49.911477Z", + "iopub.status.busy": "2026-08-06T05:17:49.911354Z", + "iopub.status.idle": "2026-08-06T05:17:49.914330Z", + "shell.execute_reply": "2026-08-06T05:17:49.913921Z" } }, "outputs": [ @@ -1331,7 +1331,7 @@ }, { "cell_type": "markdown", - "id": "a04fe7d0", + "id": "17603647", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/matverse_guide/docs/tutorials/magnetic_ordering.ipynb b/matverse_guide/docs/tutorials/magnetic_ordering.ipynb index afcc41b..7651a2e 100644 --- a/matverse_guide/docs/tutorials/magnetic_ordering.ipynb +++ b/matverse_guide/docs/tutorials/magnetic_ordering.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2fc9d1f0", + "id": "dd107d8e", "metadata": {}, "source": [ "# Magnetic ordering\n", @@ -24,13 +24,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "a4042818", + "id": "4ed2fb7a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:21:59.100251Z", - "iopub.status.busy": "2026-08-05T21:21:59.100051Z", - "iopub.status.idle": "2026-08-05T21:22:09.183820Z", - "shell.execute_reply": "2026-08-05T21:22:09.183271Z" + "iopub.execute_input": "2026-08-06T04:59:25.820633Z", + "iopub.status.busy": "2026-08-06T04:59:25.820550Z", + "iopub.status.idle": "2026-08-06T04:59:34.430468Z", + "shell.execute_reply": "2026-08-06T04:59:34.429698Z" } }, "outputs": [ @@ -74,7 +74,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "5d40366c", + "id": "3e7df204", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -102,13 +102,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "b0c62855", + "id": "9cc3c3b4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.185571Z", - "iopub.status.busy": "2026-08-05T21:22:09.185126Z", - "iopub.status.idle": "2026-08-05T21:22:09.335106Z", - "shell.execute_reply": "2026-08-05T21:22:09.334608Z" + "iopub.execute_input": "2026-08-06T04:59:34.435500Z", + "iopub.status.busy": "2026-08-06T04:59:34.433872Z", + "iopub.status.idle": "2026-08-06T04:59:34.516763Z", + "shell.execute_reply": "2026-08-06T04:59:34.516304Z" } }, "outputs": [ @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "fb5856f9", + "id": "8ea4e24b", "metadata": {}, "source": [ "## Which elements can even carry a moment" @@ -205,13 +205,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "a2645c89", + "id": "495af205", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.336465Z", - "iopub.status.busy": "2026-08-05T21:22:09.336342Z", - "iopub.status.idle": "2026-08-05T21:22:09.802856Z", - "shell.execute_reply": "2026-08-05T21:22:09.802414Z" + "iopub.execute_input": "2026-08-06T04:59:34.518160Z", + "iopub.status.busy": "2026-08-06T04:59:34.518012Z", + "iopub.status.idle": "2026-08-06T04:59:34.945248Z", + "shell.execute_reply": "2026-08-06T04:59:34.944722Z" } }, "outputs": [ @@ -293,7 +293,7 @@ }, { "cell_type": "markdown", - "id": "c8ea6690", + "id": "5efe4213", "metadata": {}, "source": [ "Read those two columns carefully, because they answer different questions.\n", @@ -315,13 +315,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "2869615a", + "id": "6cec496e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.810897Z", - "iopub.status.busy": "2026-08-05T21:22:09.810783Z", - "iopub.status.idle": "2026-08-05T21:22:09.813249Z", - "shell.execute_reply": "2026-08-05T21:22:09.812909Z" + "iopub.execute_input": "2026-08-06T04:59:34.946591Z", + "iopub.status.busy": "2026-08-06T04:59:34.946483Z", + "iopub.status.idle": "2026-08-06T04:59:34.948865Z", + "shell.execute_reply": "2026-08-06T04:59:34.948468Z" } }, "outputs": [ @@ -361,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "ea0bb9e7", + "id": "3f0f7e45", "metadata": {}, "source": [ "## Enumerating orderings\n", @@ -374,13 +374,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "aef11f5d", + "id": "ef8b6474", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:09.813971Z", - "iopub.status.busy": "2026-08-05T21:22:09.813883Z", - "iopub.status.idle": "2026-08-05T21:22:10.087447Z", - "shell.execute_reply": "2026-08-05T21:22:10.087042Z" + "iopub.execute_input": "2026-08-06T04:59:34.949909Z", + "iopub.status.busy": "2026-08-06T04:59:34.949820Z", + "iopub.status.idle": "2026-08-06T04:59:35.153622Z", + "shell.execute_reply": "2026-08-06T04:59:35.153115Z" } }, "outputs": [ @@ -408,13 +408,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "1c76e132", + "id": "761bfff4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.088614Z", - "iopub.status.busy": "2026-08-05T21:22:10.088492Z", - "iopub.status.idle": "2026-08-05T21:22:10.109757Z", - "shell.execute_reply": "2026-08-05T21:22:10.109270Z" + "iopub.execute_input": "2026-08-06T04:59:35.154690Z", + "iopub.status.busy": "2026-08-06T04:59:35.154583Z", + "iopub.status.idle": "2026-08-06T04:59:35.165573Z", + "shell.execute_reply": "2026-08-06T04:59:35.165133Z" } }, "outputs": [ @@ -549,7 +549,7 @@ }, { "cell_type": "markdown", - "id": "14813e76", + "id": "9b7d3c8c", "metadata": {}, "source": [ "Three things worth reading in that table.\n", @@ -570,13 +570,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "38df0dcf", + "id": "ef043894", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.110658Z", - "iopub.status.busy": "2026-08-05T21:22:10.110538Z", - "iopub.status.idle": "2026-08-05T21:22:10.113052Z", - "shell.execute_reply": "2026-08-05T21:22:10.112671Z" + "iopub.execute_input": "2026-08-06T04:59:35.166452Z", + "iopub.status.busy": "2026-08-06T04:59:35.166342Z", + "iopub.status.idle": "2026-08-06T04:59:35.168675Z", + "shell.execute_reply": "2026-08-06T04:59:35.168303Z" } }, "outputs": [ @@ -597,7 +597,7 @@ }, { "cell_type": "markdown", - "id": "9549b6a5", + "id": "05e9c30c", "metadata": {}, "source": [ "```{note}\n", @@ -614,13 +614,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "82fca92f", + "id": "23fe1f33", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.113830Z", - "iopub.status.busy": "2026-08-05T21:22:10.113727Z", - "iopub.status.idle": "2026-08-05T21:22:10.115966Z", - "shell.execute_reply": "2026-08-05T21:22:10.115600Z" + "iopub.execute_input": "2026-08-06T04:59:35.169459Z", + "iopub.status.busy": "2026-08-06T04:59:35.169352Z", + "iopub.status.idle": "2026-08-06T04:59:35.171534Z", + "shell.execute_reply": "2026-08-06T04:59:35.171181Z" } }, "outputs": [ @@ -642,7 +642,7 @@ }, { "cell_type": "markdown", - "id": "67297c2c", + "id": "a8cc42de", "metadata": {}, "source": [ "## Picking the ground state\n", @@ -654,13 +654,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "c940176f", + "id": "e9077e3a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.116709Z", - "iopub.status.busy": "2026-08-05T21:22:10.116610Z", - "iopub.status.idle": "2026-08-05T21:22:10.156287Z", - "shell.execute_reply": "2026-08-05T21:22:10.147178Z" + "iopub.execute_input": "2026-08-06T04:59:35.172326Z", + "iopub.status.busy": "2026-08-06T04:59:35.172232Z", + "iopub.status.idle": "2026-08-06T04:59:35.189982Z", + "shell.execute_reply": "2026-08-06T04:59:35.189578Z" } }, "outputs": [ @@ -739,7 +739,7 @@ }, { "cell_type": "markdown", - "id": "7bdd846c", + "id": "ace1aef9", "metadata": {}, "source": [ "## The spread is zero, and that is the answer\n", @@ -759,13 +759,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "28d2bb48", + "id": "ac158b08", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.157372Z", - "iopub.status.busy": "2026-08-05T21:22:10.157233Z", - "iopub.status.idle": "2026-08-05T21:22:10.164588Z", - "shell.execute_reply": "2026-08-05T21:22:10.164235Z" + "iopub.execute_input": "2026-08-06T04:59:35.190825Z", + "iopub.status.busy": "2026-08-06T04:59:35.190728Z", + "iopub.status.idle": "2026-08-06T04:59:35.192845Z", + "shell.execute_reply": "2026-08-06T04:59:35.192486Z" } }, "outputs": [ @@ -789,7 +789,7 @@ }, { "cell_type": "markdown", - "id": "d7d462cf", + "id": "6639618c", "metadata": {}, "source": [ "```{warning}\n", @@ -832,13 +832,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "de4485bb", + "id": "ca2f9d11", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.165406Z", - "iopub.status.busy": "2026-08-05T21:22:10.165305Z", - "iopub.status.idle": "2026-08-05T21:22:10.172642Z", - "shell.execute_reply": "2026-08-05T21:22:10.172269Z" + "iopub.execute_input": "2026-08-06T04:59:35.193553Z", + "iopub.status.busy": "2026-08-06T04:59:35.193469Z", + "iopub.status.idle": "2026-08-06T04:59:35.195799Z", + "shell.execute_reply": "2026-08-06T04:59:35.195208Z" } }, "outputs": [ @@ -859,7 +859,7 @@ }, { "cell_type": "markdown", - "id": "a965d7fe", + "id": "5ae3e9a9", "metadata": {}, "source": [ "That is deliberate. `mv.thermo.hull` needs no special case for magnetism: it\n", @@ -880,7 +880,7 @@ }, { "cell_type": "markdown", - "id": "79f7e8bc", + "id": "1be1d6da", "metadata": {}, "source": [ "## The other thing a d shell does\n", @@ -897,13 +897,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "06e51a9c", + "id": "426a44c7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.173356Z", - "iopub.status.busy": "2026-08-05T21:22:10.173252Z", - "iopub.status.idle": "2026-08-05T21:22:10.625765Z", - "shell.execute_reply": "2026-08-05T21:22:10.625400Z" + "iopub.execute_input": "2026-08-06T04:59:35.197703Z", + "iopub.status.busy": "2026-08-06T04:59:35.197609Z", + "iopub.status.idle": "2026-08-06T04:59:35.418149Z", + "shell.execute_reply": "2026-08-06T04:59:35.417752Z" } }, "outputs": [ @@ -992,7 +992,7 @@ }, { "cell_type": "markdown", - "id": "b7e62612", + "id": "b57123f5", "metadata": {}, "source": [ "Mn³⁺ and Ni³⁺ come out **strong** and Ti⁴⁺ inactive, which is the textbook\n", @@ -1016,7 +1016,7 @@ }, { "cell_type": "markdown", - "id": "14bd33dd", + "id": "d7aaed40", "metadata": {}, "source": [ "## How far above room temperature does it stay a magnet?\n", @@ -1032,13 +1032,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "fcb63dbf", + "id": "b100f172", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.626589Z", - "iopub.status.busy": "2026-08-05T21:22:10.626496Z", - "iopub.status.idle": "2026-08-05T21:22:10.665734Z", - "shell.execute_reply": "2026-08-05T21:22:10.665375Z" + "iopub.execute_input": "2026-08-06T04:59:35.419075Z", + "iopub.status.busy": "2026-08-06T04:59:35.418955Z", + "iopub.status.idle": "2026-08-06T04:59:35.441969Z", + "shell.execute_reply": "2026-08-06T04:59:35.441752Z" } }, "outputs": [ @@ -1117,7 +1117,7 @@ }, { "cell_type": "markdown", - "id": "0446b53f", + "id": "9bb70c76", "metadata": {}, "source": [ "The ferromagnetic arrangement is lower, so the coupling is positive and the\n", @@ -1139,7 +1139,7 @@ }, { "cell_type": "markdown", - "id": "54659c6b", + "id": "b8de8253", "metadata": {}, "source": [ "### When the fit has nothing to fit\n", @@ -1153,13 +1153,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "e8d915aa", + "id": "44821289", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.666524Z", - "iopub.status.busy": "2026-08-05T21:22:10.666428Z", - "iopub.status.idle": "2026-08-05T21:22:10.671427Z", - "shell.execute_reply": "2026-08-05T21:22:10.671095Z" + "iopub.execute_input": "2026-08-06T04:59:35.444161Z", + "iopub.status.busy": "2026-08-06T04:59:35.444068Z", + "iopub.status.idle": "2026-08-06T04:59:35.448949Z", + "shell.execute_reply": "2026-08-06T04:59:35.448580Z" } }, "outputs": [ @@ -1197,7 +1197,7 @@ }, { "cell_type": "markdown", - "id": "4728c817", + "id": "f5538908", "metadata": {}, "source": [ "A NaN and a stated reason, rather than a number near zero that would read as\n", @@ -1206,7 +1206,7 @@ }, { "cell_type": "markdown", - "id": "bf40a8ac", + "id": "cf8e13a9", "metadata": {}, "source": [ "## What the moments cost in symmetry\n", @@ -1225,13 +1225,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "4bb7b471", + "id": "ac0f9632", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:10.672126Z", - "iopub.status.busy": "2026-08-05T21:22:10.672039Z", - "iopub.status.idle": "2026-08-05T21:22:10.872830Z", - "shell.execute_reply": "2026-08-05T21:22:10.872436Z" + "iopub.execute_input": "2026-08-06T04:59:35.449668Z", + "iopub.status.busy": "2026-08-06T04:59:35.449581Z", + "iopub.status.idle": "2026-08-06T04:59:35.553780Z", + "shell.execute_reply": "2026-08-06T04:59:35.553459Z" } }, "outputs": [ @@ -1321,7 +1321,7 @@ }, { "cell_type": "markdown", - "id": "c5ac04b0", + "id": "2f561c63", "metadata": {}, "source": [ "bcc iron has **96** operations. With no moments all 96 survive. With any\n", diff --git a/matverse_guide/docs/tutorials/models_and_campaigns.ipynb b/matverse_guide/docs/tutorials/models_and_campaigns.ipynb index 5fa58c5..a0d04ae 100644 --- a/matverse_guide/docs/tutorials/models_and_campaigns.ipynb +++ b/matverse_guide/docs/tutorials/models_and_campaigns.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "6fb9bf5d", + "id": "fefaf278", "metadata": {}, "source": [ "# Models and campaigns\n", @@ -19,13 +19,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "dc75f309", + "id": "b45d0771", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:51.401845Z", - "iopub.status.busy": "2026-08-05T21:18:51.401765Z", - "iopub.status.idle": "2026-08-05T21:18:56.584271Z", - "shell.execute_reply": "2026-08-05T21:18:56.583861Z" + "iopub.execute_input": "2026-08-06T04:55:33.355979Z", + "iopub.status.busy": "2026-08-06T04:55:33.355843Z", + "iopub.status.idle": "2026-08-06T04:55:42.198097Z", + "shell.execute_reply": "2026-08-06T04:55:42.197569Z" } }, "outputs": [ @@ -69,7 +69,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "493fc9a4", + "id": "f1dba22e", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -98,13 +98,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "a2f3f32e", + "id": "9198bd51", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.585747Z", - "iopub.status.busy": "2026-08-05T21:18:56.585390Z", - "iopub.status.idle": "2026-08-05T21:18:56.605200Z", - "shell.execute_reply": "2026-08-05T21:18:56.604897Z" + "iopub.execute_input": "2026-08-06T04:55:42.199853Z", + "iopub.status.busy": "2026-08-06T04:55:42.199349Z", + "iopub.status.idle": "2026-08-06T04:55:42.226871Z", + "shell.execute_reply": "2026-08-06T04:55:42.226362Z" } }, "outputs": [ @@ -141,7 +141,7 @@ }, { "cell_type": "markdown", - "id": "a95c206c", + "id": "ad1180c7", "metadata": {}, "source": [ "Each binary sits at the mean of its two elemental lattice parameters — a crude\n", @@ -152,13 +152,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "33383a0a", + "id": "d66181f8", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.606002Z", - "iopub.status.busy": "2026-08-05T21:18:56.605914Z", - "iopub.status.idle": "2026-08-05T21:18:56.697102Z", - "shell.execute_reply": "2026-08-05T21:18:56.696716Z" + "iopub.execute_input": "2026-08-06T04:55:42.227842Z", + "iopub.status.busy": "2026-08-06T04:55:42.227686Z", + "iopub.status.idle": "2026-08-06T04:55:42.360656Z", + "shell.execute_reply": "2026-08-06T04:55:42.360075Z" } }, "outputs": [ @@ -282,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "6fcfc769", + "id": "53ba0ee9", "metadata": {}, "source": [ "## The split is the part to care about\n", @@ -295,13 +295,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "f3619f82", + "id": "ac2912f1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.697890Z", - "iopub.status.busy": "2026-08-05T21:18:56.697800Z", - "iopub.status.idle": "2026-08-05T21:18:56.701237Z", - "shell.execute_reply": "2026-08-05T21:18:56.700924Z" + "iopub.execute_input": "2026-08-06T04:55:42.362619Z", + "iopub.status.busy": "2026-08-06T04:55:42.362418Z", + "iopub.status.idle": "2026-08-06T04:55:42.366316Z", + "shell.execute_reply": "2026-08-06T04:55:42.365951Z" } }, "outputs": [ @@ -329,7 +329,7 @@ }, { "cell_type": "markdown", - "id": "2ab58d37", + "id": "248a1544", "metadata": {}, "source": [ "`mv.model.split` defaults to grouping by **composition**, and the default is the\n", @@ -351,13 +351,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "b527e453", + "id": "6e1c851a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.701922Z", - "iopub.status.busy": "2026-08-05T21:18:56.701838Z", - "iopub.status.idle": "2026-08-05T21:18:56.704381Z", - "shell.execute_reply": "2026-08-05T21:18:56.704091Z" + "iopub.execute_input": "2026-08-06T04:55:42.367382Z", + "iopub.status.busy": "2026-08-06T04:55:42.367202Z", + "iopub.status.idle": "2026-08-06T04:55:42.369976Z", + "shell.execute_reply": "2026-08-06T04:55:42.369683Z" } }, "outputs": [ @@ -379,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "50e5e47c", + "id": "d1fe17a5", "metadata": {}, "source": [ "The element holdout is the hardest honest split and the one a discovery campaign\n", @@ -398,13 +398,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "7d03bf76", + "id": "f545b58a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.705081Z", - "iopub.status.busy": "2026-08-05T21:18:56.704995Z", - "iopub.status.idle": "2026-08-05T21:18:56.906801Z", - "shell.execute_reply": "2026-08-05T21:18:56.906340Z" + "iopub.execute_input": "2026-08-06T04:55:42.371600Z", + "iopub.status.busy": "2026-08-06T04:55:42.371152Z", + "iopub.status.idle": "2026-08-06T04:55:42.619427Z", + "shell.execute_reply": "2026-08-06T04:55:42.618968Z" } }, "outputs": [ @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "16b39365", + "id": "fcdf00ac", "metadata": {}, "source": [ "The prediction is a **level of theory**, not a special kind of column." @@ -440,13 +440,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "678266b2", + "id": "619da6e0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.907691Z", - "iopub.status.busy": "2026-08-05T21:18:56.907598Z", - "iopub.status.idle": "2026-08-05T21:18:56.909805Z", - "shell.execute_reply": "2026-08-05T21:18:56.909535Z" + "iopub.execute_input": "2026-08-06T04:55:42.621358Z", + "iopub.status.busy": "2026-08-06T04:55:42.620930Z", + "iopub.status.idle": "2026-08-06T04:55:42.624583Z", + "shell.execute_reply": "2026-08-06T04:55:42.624125Z" } }, "outputs": [ @@ -478,7 +478,7 @@ }, { "cell_type": "markdown", - "id": "4f7991fa", + "id": "89a877c2", "metadata": {}, "source": [ "That matters for the same reason it does everywhere else in matverse: a\n", @@ -494,13 +494,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "f13f69c0", + "id": "27fbf731", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.910539Z", - "iopub.status.busy": "2026-08-05T21:18:56.910453Z", - "iopub.status.idle": "2026-08-05T21:18:56.915723Z", - "shell.execute_reply": "2026-08-05T21:18:56.915420Z" + "iopub.execute_input": "2026-08-06T04:55:42.638501Z", + "iopub.status.busy": "2026-08-06T04:55:42.638037Z", + "iopub.status.idle": "2026-08-06T04:55:42.645147Z", + "shell.execute_reply": "2026-08-06T04:55:42.644449Z" } }, "outputs": [ @@ -626,7 +626,7 @@ }, { "cell_type": "markdown", - "id": "d7c8b371", + "id": "5ef483ae", "metadata": {}, "source": [ "It is honestly labelled **uncalibrated**. It is useful for deciding what to\n", @@ -636,13 +636,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "ff7dc611", + "id": "3319a98f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.916486Z", - "iopub.status.busy": "2026-08-05T21:18:56.916396Z", - "iopub.status.idle": "2026-08-05T21:18:56.918430Z", - "shell.execute_reply": "2026-08-05T21:18:56.918148Z" + "iopub.execute_input": "2026-08-06T04:55:42.646518Z", + "iopub.status.busy": "2026-08-06T04:55:42.646100Z", + "iopub.status.idle": "2026-08-06T04:55:42.649150Z", + "shell.execute_reply": "2026-08-06T04:55:42.648914Z" } }, "outputs": [ @@ -666,7 +666,7 @@ }, { "cell_type": "markdown", - "id": "7a176d2c", + "id": "9b7fe8cf", "metadata": {}, "source": [ "Only scikit-learn is wired. Graph networks and fine-tuned interatomic potentials\n", @@ -677,13 +677,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "878cf023", + "id": "08ec547b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.919154Z", - "iopub.status.busy": "2026-08-05T21:18:56.919071Z", - "iopub.status.idle": "2026-08-05T21:18:56.986313Z", - "shell.execute_reply": "2026-08-05T21:18:56.985920Z" + "iopub.execute_input": "2026-08-06T04:55:42.650757Z", + "iopub.status.busy": "2026-08-06T04:55:42.650616Z", + "iopub.status.idle": "2026-08-06T04:55:42.719813Z", + "shell.execute_reply": "2026-08-06T04:55:42.719464Z" } }, "outputs": [ @@ -691,9 +691,9 @@ "data": { "text/plain": [ "{'n': 6,\n", - " 'mae': 0.017274831817887117,\n", - " 'rmse': 0.02353478742144657,\n", - " 'r2': 0.8869210928074481}" + " 'mae': 0.019450246268847757,\n", + " 'rmse': 0.02558749923481937,\n", + " 'r2': 0.8663352998833478}" ] }, "execution_count": 10, @@ -712,7 +712,7 @@ }, { "cell_type": "markdown", - "id": "38e2323d", + "id": "ff21d87a", "metadata": {}, "source": [ "### Uncertainty from a committee instead\n", @@ -726,13 +726,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "e9973216", + "id": "e12fba15", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.987103Z", - "iopub.status.busy": "2026-08-05T21:18:56.987012Z", - "iopub.status.idle": "2026-08-05T21:18:56.992796Z", - "shell.execute_reply": "2026-08-05T21:18:56.992474Z" + "iopub.execute_input": "2026-08-06T04:55:42.721121Z", + "iopub.status.busy": "2026-08-06T04:55:42.721026Z", + "iopub.status.idle": "2026-08-06T04:55:42.731564Z", + "shell.execute_reply": "2026-08-06T04:55:42.731221Z" } }, "outputs": [ @@ -831,7 +831,7 @@ }, { "cell_type": "markdown", - "id": "4f8ee130", + "id": "afac1471", "metadata": {}, "source": [ "The two members here differ by a constant, so the spread is the same everywhere\n", @@ -847,13 +847,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "6ef0bd0c", + "id": "b5e1fd1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:56.993490Z", - "iopub.status.busy": "2026-08-05T21:18:56.993406Z", - "iopub.status.idle": "2026-08-05T21:18:58.497030Z", - "shell.execute_reply": "2026-08-05T21:18:58.496660Z" + "iopub.execute_input": "2026-08-06T04:55:42.732934Z", + "iopub.status.busy": "2026-08-06T04:55:42.732787Z", + "iopub.status.idle": "2026-08-06T04:55:44.266412Z", + "shell.execute_reply": "2026-08-06T04:55:44.265867Z" } }, "outputs": [ @@ -926,13 +926,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "72b3db29", + "id": "159a21cc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.498113Z", - "iopub.status.busy": "2026-08-05T21:18:58.498019Z", - "iopub.status.idle": "2026-08-05T21:18:58.594650Z", - "shell.execute_reply": "2026-08-05T21:18:58.594309Z" + "iopub.execute_input": "2026-08-06T04:55:44.267708Z", + "iopub.status.busy": "2026-08-06T04:55:44.267586Z", + "iopub.status.idle": "2026-08-06T04:55:44.384579Z", + "shell.execute_reply": "2026-08-06T04:55:44.383488Z" } }, "outputs": [ @@ -979,13 +979,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "302329d0", + "id": "115cb1b5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.595723Z", - "iopub.status.busy": "2026-08-05T21:18:58.595597Z", - "iopub.status.idle": "2026-08-05T21:18:58.597883Z", - "shell.execute_reply": "2026-08-05T21:18:58.597562Z" + "iopub.execute_input": "2026-08-06T04:55:44.386516Z", + "iopub.status.busy": "2026-08-06T04:55:44.385915Z", + "iopub.status.idle": "2026-08-06T04:55:44.390519Z", + "shell.execute_reply": "2026-08-06T04:55:44.389851Z" } }, "outputs": [ @@ -1006,7 +1006,7 @@ }, { "cell_type": "markdown", - "id": "8387ec38", + "id": "f6ea0b41", "metadata": {}, "source": [ "`leakage_mae` is the grouped MAE minus the random one. A large **positive**\n", @@ -1052,13 +1052,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "6dc85e40", + "id": "2178ef63", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.598762Z", - "iopub.status.busy": "2026-08-05T21:18:58.598672Z", - "iopub.status.idle": "2026-08-05T21:18:58.602356Z", - "shell.execute_reply": "2026-08-05T21:18:58.602046Z" + "iopub.execute_input": "2026-08-06T04:55:44.392000Z", + "iopub.status.busy": "2026-08-06T04:55:44.391542Z", + "iopub.status.idle": "2026-08-06T04:55:44.397623Z", + "shell.execute_reply": "2026-08-06T04:55:44.396966Z" } }, "outputs": [ @@ -1086,7 +1086,7 @@ }, { "cell_type": "markdown", - "id": "53c26fcb", + "id": "b8719038", "metadata": {}, "source": [ "Each round: fit on what is known, ask for a batch, \"compute\" it, fold it back." @@ -1095,13 +1095,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "9ee5b4fe", + "id": "b35a7aeb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:58.603062Z", - "iopub.status.busy": "2026-08-05T21:18:58.602975Z", - "iopub.status.idle": "2026-08-05T21:18:59.148191Z", - "shell.execute_reply": "2026-08-05T21:18:59.147757Z" + "iopub.execute_input": "2026-08-06T04:55:44.398813Z", + "iopub.status.busy": "2026-08-06T04:55:44.398688Z", + "iopub.status.idle": "2026-08-06T04:55:44.954376Z", + "shell.execute_reply": "2026-08-06T04:55:44.953682Z" } }, "outputs": [ @@ -1232,13 +1232,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "cd81d1b6", + "id": "0dd82a74", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.149324Z", - "iopub.status.busy": "2026-08-05T21:18:59.149218Z", - "iopub.status.idle": "2026-08-05T21:18:59.151709Z", - "shell.execute_reply": "2026-08-05T21:18:59.151403Z" + "iopub.execute_input": "2026-08-06T04:55:44.955621Z", + "iopub.status.busy": "2026-08-06T04:55:44.955475Z", + "iopub.status.idle": "2026-08-06T04:55:44.959371Z", + "shell.execute_reply": "2026-08-06T04:55:44.958900Z" } }, "outputs": [ @@ -1260,20 +1260,20 @@ { "cell_type": "code", "execution_count": 18, - "id": "edfa5798", + "id": "3f23f0bc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.152415Z", - "iopub.status.busy": "2026-08-05T21:18:59.152328Z", - "iopub.status.idle": "2026-08-05T21:18:59.268633Z", - "shell.execute_reply": "2026-08-05T21:18:59.268252Z" + "iopub.execute_input": "2026-08-06T04:55:44.960500Z", + "iopub.status.busy": "2026-08-06T04:55:44.960367Z", + "iopub.status.idle": "2026-08-06T04:55:45.098207Z", + "shell.execute_reply": "2026-08-06T04:55:45.097778Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 18, @@ -1312,7 +1312,7 @@ }, { "cell_type": "markdown", - "id": "479f4184", + "id": "c69e1c50", "metadata": {}, "source": [ "The campaign found the true optimum having computed a fraction of the\n", @@ -1340,13 +1340,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "e9c0700c", + "id": "8cae0b7d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.269519Z", - "iopub.status.busy": "2026-08-05T21:18:59.269425Z", - "iopub.status.idle": "2026-08-05T21:18:59.271953Z", - "shell.execute_reply": "2026-08-05T21:18:59.271634Z" + "iopub.execute_input": "2026-08-06T04:55:45.100159Z", + "iopub.status.busy": "2026-08-06T04:55:45.099743Z", + "iopub.status.idle": "2026-08-06T04:55:45.103562Z", + "shell.execute_reply": "2026-08-06T04:55:45.103222Z" } }, "outputs": [ @@ -1369,13 +1369,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "a09f86ad", + "id": "8d145eae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.272649Z", - "iopub.status.busy": "2026-08-05T21:18:59.272562Z", - "iopub.status.idle": "2026-08-05T21:18:59.383282Z", - "shell.execute_reply": "2026-08-05T21:18:59.382892Z" + "iopub.execute_input": "2026-08-06T04:55:45.104919Z", + "iopub.status.busy": "2026-08-06T04:55:45.104779Z", + "iopub.status.idle": "2026-08-06T04:55:45.223257Z", + "shell.execute_reply": "2026-08-06T04:55:45.222958Z" } }, "outputs": [ @@ -1418,7 +1418,7 @@ }, { "cell_type": "markdown", - "id": "e4ab9021", + "id": "ee22ab30", "metadata": {}, "source": [ "A candidate is worth computing either because its predicted value is good or\n", @@ -1435,13 +1435,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "e2882057", + "id": "06265d77", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.384149Z", - "iopub.status.busy": "2026-08-05T21:18:59.384056Z", - "iopub.status.idle": "2026-08-05T21:18:59.388380Z", - "shell.execute_reply": "2026-08-05T21:18:59.388062Z" + "iopub.execute_input": "2026-08-06T04:55:45.225295Z", + "iopub.status.busy": "2026-08-06T04:55:45.224818Z", + "iopub.status.idle": "2026-08-06T04:55:45.230716Z", + "shell.execute_reply": "2026-08-06T04:55:45.230468Z" } }, "outputs": [ @@ -1468,7 +1468,7 @@ }, { "cell_type": "markdown", - "id": "07c11d8b", + "id": "da146ee9", "metadata": {}, "source": [ "Farthest-point selection among a shortlist, so the batch spreads out in\n", @@ -1492,13 +1492,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "b3b13f6a", + "id": "ed2f00ae", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.389254Z", - "iopub.status.busy": "2026-08-05T21:18:59.389163Z", - "iopub.status.idle": "2026-08-05T21:18:59.637286Z", - "shell.execute_reply": "2026-08-05T21:18:59.636835Z" + "iopub.execute_input": "2026-08-06T04:55:45.233469Z", + "iopub.status.busy": "2026-08-06T04:55:45.233053Z", + "iopub.status.idle": "2026-08-06T04:55:45.496422Z", + "shell.execute_reply": "2026-08-06T04:55:45.496007Z" } }, "outputs": [ @@ -1529,7 +1529,7 @@ }, { "cell_type": "markdown", - "id": "c0fd1504", + "id": "26909edd", "metadata": {}, "source": [ "`mv.pl.parity` draws the error bars when an uncertainty column exists,\n", @@ -1546,13 +1546,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "3d28745e", + "id": "f2123d1e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.638206Z", - "iopub.status.busy": "2026-08-05T21:18:59.638108Z", - "iopub.status.idle": "2026-08-05T21:18:59.953187Z", - "shell.execute_reply": "2026-08-05T21:18:59.952755Z" + "iopub.execute_input": "2026-08-06T04:55:45.498223Z", + "iopub.status.busy": "2026-08-06T04:55:45.497819Z", + "iopub.status.idle": "2026-08-06T04:55:45.839899Z", + "shell.execute_reply": "2026-08-06T04:55:45.839379Z" } }, "outputs": [ @@ -1586,7 +1586,7 @@ }, { "cell_type": "markdown", - "id": "b3f7ef62", + "id": "935229fc", "metadata": {}, "source": [ "A bar chart of 118 categories is unreadable and throws away the structure a\n", @@ -1597,13 +1597,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "f3e2d8dc", + "id": "d5580d52", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:59.954112Z", - "iopub.status.busy": "2026-08-05T21:18:59.953989Z", - "iopub.status.idle": "2026-08-05T21:19:00.038838Z", - "shell.execute_reply": "2026-08-05T21:19:00.038453Z" + "iopub.execute_input": "2026-08-06T04:55:45.841728Z", + "iopub.status.busy": "2026-08-06T04:55:45.841562Z", + "iopub.status.idle": "2026-08-06T04:55:45.934659Z", + "shell.execute_reply": "2026-08-06T04:55:45.934173Z" } }, "outputs": [ @@ -1640,7 +1640,7 @@ }, { "cell_type": "markdown", - "id": "63621e44", + "id": "fcd98ded", "metadata": {}, "source": [ "### The rest\n", @@ -1659,13 +1659,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "21e96f27", + "id": "3cb7fad7", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:00.039826Z", - "iopub.status.busy": "2026-08-05T21:19:00.039733Z", - "iopub.status.idle": "2026-08-05T21:19:00.680574Z", - "shell.execute_reply": "2026-08-05T21:19:00.680097Z" + "iopub.execute_input": "2026-08-06T04:55:45.935867Z", + "iopub.status.busy": "2026-08-06T04:55:45.935737Z", + "iopub.status.idle": "2026-08-06T04:55:46.588567Z", + "shell.execute_reply": "2026-08-06T04:55:46.587948Z" } }, "outputs": [ @@ -1691,7 +1691,7 @@ }, { "cell_type": "markdown", - "id": "ef241b8a", + "id": "c9aa661b", "metadata": {}, "source": [ "```{note}\n", diff --git a/matverse_guide/docs/tutorials/molecules.ipynb b/matverse_guide/docs/tutorials/molecules.ipynb index 662dceb..2966135 100644 --- a/matverse_guide/docs/tutorials/molecules.ipynb +++ b/matverse_guide/docs/tutorials/molecules.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "3f54b5a1", + "id": "591d68f0", "metadata": {}, "source": [ "# Molecules\n", @@ -27,13 +27,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "de2add3a", + "id": "57632133", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:42.789015Z", - "iopub.status.busy": "2026-08-05T21:36:42.788894Z", - "iopub.status.idle": "2026-08-05T21:36:51.076061Z", - "shell.execute_reply": "2026-08-05T21:36:51.075438Z" + "iopub.execute_input": "2026-08-06T05:20:01.609288Z", + "iopub.status.busy": "2026-08-06T05:20:01.609170Z", + "iopub.status.idle": "2026-08-06T05:20:10.735796Z", + "shell.execute_reply": "2026-08-06T05:20:10.735048Z" } }, "outputs": [ @@ -77,7 +77,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -93,7 +93,7 @@ }, { "cell_type": "markdown", - "id": "ca6f13fd", + "id": "09532cc1", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -105,13 +105,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "d85eeabc", + "id": "109cda11", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.078499Z", - "iopub.status.busy": "2026-08-05T21:36:51.077985Z", - "iopub.status.idle": "2026-08-05T21:36:51.103971Z", - "shell.execute_reply": "2026-08-05T21:36:51.103358Z" + "iopub.execute_input": "2026-08-06T05:20:10.737347Z", + "iopub.status.busy": "2026-08-06T05:20:10.736861Z", + "iopub.status.idle": "2026-08-06T05:20:10.749514Z", + "shell.execute_reply": "2026-08-06T05:20:10.748949Z" } }, "outputs": [ @@ -155,13 +155,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "e30cfe71", + "id": "ad344a1c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.105591Z", - "iopub.status.busy": "2026-08-05T21:36:51.105437Z", - "iopub.status.idle": "2026-08-05T21:36:51.113628Z", - "shell.execute_reply": "2026-08-05T21:36:51.113201Z" + "iopub.execute_input": "2026-08-06T05:20:10.750838Z", + "iopub.status.busy": "2026-08-06T05:20:10.750728Z", + "iopub.status.idle": "2026-08-06T05:20:10.759108Z", + "shell.execute_reply": "2026-08-06T05:20:10.758410Z" } }, "outputs": [ @@ -245,7 +245,7 @@ }, { "cell_type": "markdown", - "id": "23c74e4e", + "id": "773f01f3", "metadata": {}, "source": [ "The composition matrix, built without being asked, exactly as for a crystal.\n", @@ -255,13 +255,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "14972134", + "id": "80396781", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.114947Z", - "iopub.status.busy": "2026-08-05T21:36:51.114745Z", - "iopub.status.idle": "2026-08-05T21:36:51.136081Z", - "shell.execute_reply": "2026-08-05T21:36:51.135535Z" + "iopub.execute_input": "2026-08-06T05:20:10.760150Z", + "iopub.status.busy": "2026-08-06T05:20:10.760049Z", + "iopub.status.idle": "2026-08-06T05:20:10.769101Z", + "shell.execute_reply": "2026-08-06T05:20:10.768592Z" } }, "outputs": [ @@ -356,7 +356,7 @@ }, { "cell_type": "markdown", - "id": "f3353432", + "id": "b565f73e", "metadata": {}, "source": [ "`volume` and `density` are NaN, because they are properties of a *cell* and a\n", @@ -367,13 +367,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "7643a6e1", + "id": "005bba9f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.137509Z", - "iopub.status.busy": "2026-08-05T21:36:51.137366Z", - "iopub.status.idle": "2026-08-05T21:36:51.166130Z", - "shell.execute_reply": "2026-08-05T21:36:51.165551Z" + "iopub.execute_input": "2026-08-06T05:20:10.770320Z", + "iopub.status.busy": "2026-08-06T05:20:10.770203Z", + "iopub.status.idle": "2026-08-06T05:20:10.787176Z", + "shell.execute_reply": "2026-08-06T05:20:10.786532Z" } }, "outputs": [ @@ -447,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "56391c9a", + "id": "59bbece6", "metadata": {}, "source": [ "## Symmetry\n", @@ -458,13 +458,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "7ba0716c", + "id": "d7874133", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.167322Z", - "iopub.status.busy": "2026-08-05T21:36:51.167170Z", - "iopub.status.idle": "2026-08-05T21:36:51.196105Z", - "shell.execute_reply": "2026-08-05T21:36:51.195540Z" + "iopub.execute_input": "2026-08-06T05:20:10.788222Z", + "iopub.status.busy": "2026-08-06T05:20:10.788110Z", + "iopub.status.idle": "2026-08-06T05:20:10.805441Z", + "shell.execute_reply": "2026-08-06T05:20:10.804752Z" } }, "outputs": [ @@ -555,7 +555,7 @@ }, { "cell_type": "markdown", - "id": "0452eb89", + "id": "8fe93da1", "metadata": {}, "source": [ "C2v for water, **Td** for methane, C3v for ammonia, Cs for ethanol — the\n", @@ -577,13 +577,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "a3703d7d", + "id": "09659d48", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.197262Z", - "iopub.status.busy": "2026-08-05T21:36:51.197115Z", - "iopub.status.idle": "2026-08-05T21:36:51.459354Z", - "shell.execute_reply": "2026-08-05T21:36:51.458733Z" + "iopub.execute_input": "2026-08-06T05:20:10.806564Z", + "iopub.status.busy": "2026-08-06T05:20:10.806449Z", + "iopub.status.idle": "2026-08-06T05:20:10.931507Z", + "shell.execute_reply": "2026-08-06T05:20:10.930777Z" } }, "outputs": [ @@ -622,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "89502494", + "id": "4483f762", "metadata": {}, "source": [ "## Bonds\n", @@ -635,13 +635,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "8365464c", + "id": "99b94367", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:51.460768Z", - "iopub.status.busy": "2026-08-05T21:36:51.460624Z", - "iopub.status.idle": "2026-08-05T21:36:52.016836Z", - "shell.execute_reply": "2026-08-05T21:36:52.016217Z" + "iopub.execute_input": "2026-08-06T05:20:10.932773Z", + "iopub.status.busy": "2026-08-06T05:20:10.932636Z", + "iopub.status.idle": "2026-08-06T05:20:11.291293Z", + "shell.execute_reply": "2026-08-06T05:20:11.290491Z" } }, "outputs": [ @@ -665,7 +665,7 @@ }, { "cell_type": "markdown", - "id": "fd1ce922", + "id": "909adf54", "metadata": {}, "source": [ "Different *perception*, though. A crystal's neighbours come from Voronoi solid\n", @@ -676,13 +676,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "d4caf5a5", + "id": "193c9ff3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.018557Z", - "iopub.status.busy": "2026-08-05T21:36:52.017965Z", - "iopub.status.idle": "2026-08-05T21:36:52.021852Z", - "shell.execute_reply": "2026-08-05T21:36:52.021412Z" + "iopub.execute_input": "2026-08-06T05:20:11.292950Z", + "iopub.status.busy": "2026-08-06T05:20:11.292407Z", + "iopub.status.idle": "2026-08-06T05:20:11.296348Z", + "shell.execute_reply": "2026-08-06T05:20:11.295905Z" } }, "outputs": [ @@ -705,7 +705,7 @@ }, { "cell_type": "markdown", - "id": "4ef23fea", + "id": "3f94f0e0", "metadata": {}, "source": [ "## Descriptors that need the graph" @@ -714,13 +714,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "6ac3765e", + "id": "0dda6913", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.022920Z", - "iopub.status.busy": "2026-08-05T21:36:52.022819Z", - "iopub.status.idle": "2026-08-05T21:36:52.042751Z", - "shell.execute_reply": "2026-08-05T21:36:52.042132Z" + "iopub.execute_input": "2026-08-06T05:20:11.297942Z", + "iopub.status.busy": "2026-08-06T05:20:11.297530Z", + "iopub.status.idle": "2026-08-06T05:20:11.314312Z", + "shell.execute_reply": "2026-08-06T05:20:11.313561Z" } }, "outputs": [ @@ -816,7 +816,7 @@ }, { "cell_type": "markdown", - "id": "8b7e0278", + "id": "fccc58f1", "metadata": {}, "source": [ "Ethanol has **two rotatable bonds** — C–C and C–O. The C–H bonds are terminal\n", @@ -840,13 +840,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "2fcbb502", + "id": "2944937c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.043835Z", - "iopub.status.busy": "2026-08-05T21:36:52.043724Z", - "iopub.status.idle": "2026-08-05T21:36:52.074001Z", - "shell.execute_reply": "2026-08-05T21:36:52.073454Z" + "iopub.execute_input": "2026-08-06T05:20:11.315476Z", + "iopub.status.busy": "2026-08-06T05:20:11.315349Z", + "iopub.status.idle": "2026-08-06T05:20:11.339794Z", + "shell.execute_reply": "2026-08-06T05:20:11.339338Z" } }, "outputs": [ @@ -985,13 +985,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "a7424c34", + "id": "ba51bad9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.075031Z", - "iopub.status.busy": "2026-08-05T21:36:52.074930Z", - "iopub.status.idle": "2026-08-05T21:36:52.078598Z", - "shell.execute_reply": "2026-08-05T21:36:52.078135Z" + "iopub.execute_input": "2026-08-06T05:20:11.340894Z", + "iopub.status.busy": "2026-08-06T05:20:11.340765Z", + "iopub.status.idle": "2026-08-06T05:20:11.345119Z", + "shell.execute_reply": "2026-08-06T05:20:11.344701Z" } }, "outputs": [ @@ -1012,7 +1012,7 @@ }, { "cell_type": "markdown", - "id": "7122f8b2", + "id": "53311b50", "metadata": {}, "source": [ "Every cut splits nine atoms into pieces that still total nine — mass is\n", @@ -1034,13 +1034,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "d0cec674", + "id": "30298c78", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.079567Z", - "iopub.status.busy": "2026-08-05T21:36:52.079469Z", - "iopub.status.idle": "2026-08-05T21:36:52.085772Z", - "shell.execute_reply": "2026-08-05T21:36:52.085298Z" + "iopub.execute_input": "2026-08-06T05:20:11.346182Z", + "iopub.status.busy": "2026-08-06T05:20:11.346066Z", + "iopub.status.idle": "2026-08-06T05:20:11.352726Z", + "shell.execute_reply": "2026-08-06T05:20:11.352254Z" } }, "outputs": [ @@ -1112,7 +1112,7 @@ }, { "cell_type": "markdown", - "id": "523192c9", + "id": "9351c8e5", "metadata": {}, "source": [ "Ring bonds are not cut, because one cut cannot separate a ring — the molecule\n", @@ -1133,13 +1133,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "44c1e66f", + "id": "7b77b3e9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.087155Z", - "iopub.status.busy": "2026-08-05T21:36:52.086666Z", - "iopub.status.idle": "2026-08-05T21:36:52.101571Z", - "shell.execute_reply": "2026-08-05T21:36:52.101057Z" + "iopub.execute_input": "2026-08-06T05:20:11.353966Z", + "iopub.status.busy": "2026-08-06T05:20:11.353845Z", + "iopub.status.idle": "2026-08-06T05:20:11.368829Z", + "shell.execute_reply": "2026-08-06T05:20:11.368235Z" } }, "outputs": [ @@ -1223,13 +1223,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "fab1878c", + "id": "adeb8cc2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.102579Z", - "iopub.status.busy": "2026-08-05T21:36:52.102480Z", - "iopub.status.idle": "2026-08-05T21:36:52.117765Z", - "shell.execute_reply": "2026-08-05T21:36:52.117071Z" + "iopub.execute_input": "2026-08-06T05:20:11.369993Z", + "iopub.status.busy": "2026-08-06T05:20:11.369883Z", + "iopub.status.idle": "2026-08-06T05:20:11.373489Z", + "shell.execute_reply": "2026-08-06T05:20:11.372988Z" } }, "outputs": [ @@ -1256,7 +1256,7 @@ }, { "cell_type": "markdown", - "id": "795cb61c", + "id": "6d0467cc", "metadata": {}, "source": [ "The translated copy of water is recognised: matching is on the reduced formula\n", @@ -1272,13 +1272,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "8a624ffa", + "id": "0659bb3d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.121429Z", - "iopub.status.busy": "2026-08-05T21:36:52.121267Z", - "iopub.status.idle": "2026-08-05T21:36:52.276835Z", - "shell.execute_reply": "2026-08-05T21:36:52.276300Z" + "iopub.execute_input": "2026-08-06T05:20:11.375053Z", + "iopub.status.busy": "2026-08-06T05:20:11.374634Z", + "iopub.status.idle": "2026-08-06T05:20:11.529047Z", + "shell.execute_reply": "2026-08-06T05:20:11.528526Z" } }, "outputs": [ @@ -1315,7 +1315,7 @@ }, { "cell_type": "markdown", - "id": "41e97ece", + "id": "56b02eb4", "metadata": {}, "source": [ "Crude, and it needs nothing extra. With `py3Dmol` installed the default backend\n", @@ -1332,13 +1332,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "4ab11564", + "id": "1a841d19", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.277897Z", - "iopub.status.busy": "2026-08-05T21:36:52.277788Z", - "iopub.status.idle": "2026-08-05T21:36:52.294316Z", - "shell.execute_reply": "2026-08-05T21:36:52.293784Z" + "iopub.execute_input": "2026-08-06T05:20:11.530509Z", + "iopub.status.busy": "2026-08-06T05:20:11.530381Z", + "iopub.status.idle": "2026-08-06T05:20:11.547728Z", + "shell.execute_reply": "2026-08-06T05:20:11.547268Z" } }, "outputs": [ @@ -1432,7 +1432,7 @@ }, { "cell_type": "markdown", - "id": "89b77b74", + "id": "f972be05", "metadata": {}, "source": [ "QC, composition descriptors and even a calculator run unmodified. EMT is\n", @@ -1448,13 +1448,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "0ac45f7d", + "id": "4ab7761d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.295338Z", - "iopub.status.busy": "2026-08-05T21:36:52.295226Z", - "iopub.status.idle": "2026-08-05T21:36:52.304763Z", - "shell.execute_reply": "2026-08-05T21:36:52.304201Z" + "iopub.execute_input": "2026-08-06T05:20:11.548849Z", + "iopub.status.busy": "2026-08-06T05:20:11.548722Z", + "iopub.status.idle": "2026-08-06T05:20:11.557092Z", + "shell.execute_reply": "2026-08-06T05:20:11.556594Z" } }, "outputs": [ @@ -1475,7 +1475,7 @@ }, { "cell_type": "markdown", - "id": "4b1fbb95", + "id": "521affb6", "metadata": {}, "source": [ "```{seealso}\n", @@ -1487,7 +1487,7 @@ }, { "cell_type": "markdown", - "id": "a42abdad", + "id": "c49d8465", "metadata": {}, "source": [ "## Are the bonds the right length?\n", @@ -1502,13 +1502,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "054de4d5", + "id": "08d7fbd6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.305849Z", - "iopub.status.busy": "2026-08-05T21:36:52.305730Z", - "iopub.status.idle": "2026-08-05T21:36:52.327921Z", - "shell.execute_reply": "2026-08-05T21:36:52.327210Z" + "iopub.execute_input": "2026-08-06T05:20:11.558625Z", + "iopub.status.busy": "2026-08-06T05:20:11.558187Z", + "iopub.status.idle": "2026-08-06T05:20:11.577461Z", + "shell.execute_reply": "2026-08-06T05:20:11.576650Z" } }, "outputs": [ @@ -1608,7 +1608,7 @@ }, { "cell_type": "markdown", - "id": "0eaec02d", + "id": "9807f9ad", "metadata": {}, "source": [ "Water comes out at **zero** deviation, because it was built at exactly the\n", @@ -1630,7 +1630,7 @@ }, { "cell_type": "markdown", - "id": "6c5a09bc", + "id": "9dbca437", "metadata": {}, "source": [ "## Two questions that both mean \"the same molecule\"\n", @@ -1646,13 +1646,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "b5517ee3", + "id": "739a25f0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.329010Z", - "iopub.status.busy": "2026-08-05T21:36:52.328902Z", - "iopub.status.idle": "2026-08-05T21:36:52.340900Z", - "shell.execute_reply": "2026-08-05T21:36:52.340412Z" + "iopub.execute_input": "2026-08-06T05:20:11.578531Z", + "iopub.status.busy": "2026-08-06T05:20:11.578413Z", + "iopub.status.idle": "2026-08-06T05:20:11.616407Z", + "shell.execute_reply": "2026-08-06T05:20:11.615706Z" } }, "outputs": [ @@ -1682,7 +1682,7 @@ }, { "cell_type": "markdown", - "id": "910ea018", + "id": "a31a691f", "metadata": {}, "source": [ "**Geometry says two molecules. Topology says one.**\n", @@ -1699,7 +1699,7 @@ }, { "cell_type": "markdown", - "id": "9a9a82c9", + "id": "c4404e37", "metadata": {}, "source": [ "## Which bond breaks first\n", @@ -1713,13 +1713,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "9fa05c8b", + "id": "0c3f3ef4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.348181Z", - "iopub.status.busy": "2026-08-05T21:36:52.341781Z", - "iopub.status.idle": "2026-08-05T21:36:52.392407Z", - "shell.execute_reply": "2026-08-05T21:36:52.383945Z" + "iopub.execute_input": "2026-08-06T05:20:11.617556Z", + "iopub.status.busy": "2026-08-06T05:20:11.617428Z", + "iopub.status.idle": "2026-08-06T05:20:11.643967Z", + "shell.execute_reply": "2026-08-06T05:20:11.643262Z" } }, "outputs": [ @@ -1842,7 +1842,7 @@ }, { "cell_type": "markdown", - "id": "78238e39", + "id": "36067e8b", "metadata": {}, "source": [ "Eight bonds, one row each, every one named. With the placeholder energies above\n", @@ -1867,7 +1867,7 @@ }, { "cell_type": "markdown", - "id": "2a31cefc", + "id": "fb9a0bef", "metadata": {}, "source": [ "## What is actually on the molecule\n", @@ -1884,13 +1884,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "b38083ae", + "id": "471df0c1", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.393813Z", - "iopub.status.busy": "2026-08-05T21:36:52.393668Z", - "iopub.status.idle": "2026-08-05T21:36:52.416132Z", - "shell.execute_reply": "2026-08-05T21:36:52.415304Z" + "iopub.execute_input": "2026-08-06T05:20:11.645088Z", + "iopub.status.busy": "2026-08-06T05:20:11.644961Z", + "iopub.status.idle": "2026-08-06T05:20:11.655514Z", + "shell.execute_reply": "2026-08-06T05:20:11.654863Z" } }, "outputs": [ @@ -1929,7 +1929,7 @@ }, { "cell_type": "markdown", - "id": "b3349250", + "id": "1b31fa8d", "metadata": {}, "source": [ "Ethanol comes back as `[CH3];[OH]` — a methyl and a hydroxyl, which is what it\n", @@ -1952,7 +1952,7 @@ }, { "cell_type": "markdown", - "id": "64cf9bc0", + "id": "5d486a90", "metadata": {}, "source": [ "## Free energies, and the mode you trust least\n", @@ -1970,13 +1970,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "aeed8a51", + "id": "0fab2c8f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:36:52.417403Z", - "iopub.status.busy": "2026-08-05T21:36:52.417252Z", - "iopub.status.idle": "2026-08-05T21:36:52.442335Z", - "shell.execute_reply": "2026-08-05T21:36:52.441302Z" + "iopub.execute_input": "2026-08-06T05:20:11.656653Z", + "iopub.status.busy": "2026-08-06T05:20:11.656537Z", + "iopub.status.idle": "2026-08-06T05:20:11.669623Z", + "shell.execute_reply": "2026-08-06T05:20:11.668963Z" } }, "outputs": [ @@ -2055,7 +2055,7 @@ }, { "cell_type": "markdown", - "id": "3facb367", + "id": "85a6abb3", "metadata": {}, "source": [ "Same molecule, same energy, one mode moved. The stiff case agrees to four\n", diff --git a/matverse_guide/docs/tutorials/screening.ipynb b/matverse_guide/docs/tutorials/screening.ipynb index 4725203..81865b4 100644 --- a/matverse_guide/docs/tutorials/screening.ipynb +++ b/matverse_guide/docs/tutorials/screening.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "e9ce6f87", + "id": "c3109075", "metadata": {}, "source": [ "# Screening, end to end\n", @@ -26,13 +26,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "360ad4fd", + "id": "a7221752", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:12.643566Z", - "iopub.status.busy": "2026-08-05T21:18:12.643485Z", - "iopub.status.idle": "2026-08-05T21:18:18.527875Z", - "shell.execute_reply": "2026-08-05T21:18:18.527222Z" + "iopub.execute_input": "2026-08-06T04:54:19.341575Z", + "iopub.status.busy": "2026-08-06T04:54:19.341456Z", + "iopub.status.idle": "2026-08-06T04:54:25.786266Z", + "shell.execute_reply": "2026-08-06T04:54:25.785766Z" } }, "outputs": [ @@ -76,7 +76,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "8557f21e", + "id": "a82f63fa", "metadata": {}, "source": [ "## Build a dataset\n", @@ -103,13 +103,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "ee8849f9", + "id": "dc27a21e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.529541Z", - "iopub.status.busy": "2026-08-05T21:18:18.528970Z", - "iopub.status.idle": "2026-08-05T21:18:18.543371Z", - "shell.execute_reply": "2026-08-05T21:18:18.542888Z" + "iopub.execute_input": "2026-08-06T04:54:25.788074Z", + "iopub.status.busy": "2026-08-06T04:54:25.787517Z", + "iopub.status.idle": "2026-08-06T04:54:25.801047Z", + "shell.execute_reply": "2026-08-06T04:54:25.800775Z" } }, "outputs": [ @@ -177,7 +177,7 @@ }, { "cell_type": "markdown", - "id": "3173349f", + "id": "7f69af9b", "metadata": {}, "source": [ "The candidates are L1₂ orderings of the same three elements, plus a B2 AlNi.\n", @@ -188,13 +188,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "9ffcc08d", + "id": "2d5e4c31", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.544399Z", - "iopub.status.busy": "2026-08-05T21:18:18.544288Z", - "iopub.status.idle": "2026-08-05T21:18:18.547460Z", - "shell.execute_reply": "2026-08-05T21:18:18.546925Z" + "iopub.execute_input": "2026-08-06T04:54:25.802031Z", + "iopub.status.busy": "2026-08-06T04:54:25.801891Z", + "iopub.status.idle": "2026-08-06T04:54:25.807353Z", + "shell.execute_reply": "2026-08-06T04:54:25.807074Z" } }, "outputs": [], @@ -225,7 +225,7 @@ }, { "cell_type": "markdown", - "id": "7e8ec7a3", + "id": "c8f6e9b8", "metadata": {}, "source": [ "Put the published elementals and the candidates into one object. Building it in\n", @@ -236,13 +236,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "69ee8ac3", + "id": "a4e94a8d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.548512Z", - "iopub.status.busy": "2026-08-05T21:18:18.548422Z", - "iopub.status.idle": "2026-08-05T21:18:18.555698Z", - "shell.execute_reply": "2026-08-05T21:18:18.554991Z" + "iopub.execute_input": "2026-08-06T04:54:25.808410Z", + "iopub.status.busy": "2026-08-06T04:54:25.808276Z", + "iopub.status.idle": "2026-08-06T04:54:25.814783Z", + "shell.execute_reply": "2026-08-06T04:54:25.814520Z" } }, "outputs": [ @@ -268,7 +268,7 @@ }, { "cell_type": "markdown", - "id": "c7b26ffd", + "id": "13e4d52e", "metadata": {}, "source": [ "Seven materials, three elements. `X` is already the composition matrix and `var`\n", @@ -289,13 +289,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "d4db7e20", + "id": "eb99d0e4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.556544Z", - "iopub.status.busy": "2026-08-05T21:18:18.556451Z", - "iopub.status.idle": "2026-08-05T21:18:18.666144Z", - "shell.execute_reply": "2026-08-05T21:18:18.665760Z" + "iopub.execute_input": "2026-08-06T04:54:25.815643Z", + "iopub.status.busy": "2026-08-06T04:54:25.815512Z", + "iopub.status.idle": "2026-08-06T04:54:25.929944Z", + "shell.execute_reply": "2026-08-06T04:54:25.929660Z" } }, "outputs": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "264ce899", + "id": "a33784e4", "metadata": {}, "source": [ "`standardize` deposits two new structure variants rather than replacing the\n", @@ -407,13 +407,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "faedb03f", + "id": "d14b3364", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.667221Z", - "iopub.status.busy": "2026-08-05T21:18:18.667126Z", - "iopub.status.idle": "2026-08-05T21:18:18.669379Z", - "shell.execute_reply": "2026-08-05T21:18:18.668991Z" + "iopub.execute_input": "2026-08-06T04:54:25.930860Z", + "iopub.status.busy": "2026-08-06T04:54:25.930716Z", + "iopub.status.idle": "2026-08-06T04:54:25.932775Z", + "shell.execute_reply": "2026-08-06T04:54:25.932535Z" } }, "outputs": [ @@ -434,7 +434,7 @@ }, { "cell_type": "markdown", - "id": "b36c066d", + "id": "43505b01", "metadata": {}, "source": [ "## Throw out what is broken\n", @@ -448,13 +448,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "bb85a1c0", + "id": "e30a6b6c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.670191Z", - "iopub.status.busy": "2026-08-05T21:18:18.670105Z", - "iopub.status.idle": "2026-08-05T21:18:18.940585Z", - "shell.execute_reply": "2026-08-05T21:18:18.939943Z" + "iopub.execute_input": "2026-08-06T04:54:25.933613Z", + "iopub.status.busy": "2026-08-06T04:54:25.933484Z", + "iopub.status.idle": "2026-08-06T04:54:26.205134Z", + "shell.execute_reply": "2026-08-06T04:54:26.204833Z" } }, "outputs": [ @@ -571,13 +571,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "c1873cce", + "id": "9c5f7d3e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.941913Z", - "iopub.status.busy": "2026-08-05T21:18:18.941770Z", - "iopub.status.idle": "2026-08-05T21:18:18.950618Z", - "shell.execute_reply": "2026-08-05T21:18:18.950137Z" + "iopub.execute_input": "2026-08-06T04:54:26.206065Z", + "iopub.status.busy": "2026-08-06T04:54:26.205922Z", + "iopub.status.idle": "2026-08-06T04:54:26.212288Z", + "shell.execute_reply": "2026-08-06T04:54:26.212028Z" } }, "outputs": [ @@ -599,7 +599,7 @@ }, { "cell_type": "markdown", - "id": "1cfc7580", + "id": "71be0cf0", "metadata": {}, "source": [ "This is one of the few calls that returns instead of depositing, because AnnData\n", @@ -611,13 +611,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "89a1c907", + "id": "b736265c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.951602Z", - "iopub.status.busy": "2026-08-05T21:18:18.951496Z", - "iopub.status.idle": "2026-08-05T21:18:18.955602Z", - "shell.execute_reply": "2026-08-05T21:18:18.955186Z" + "iopub.execute_input": "2026-08-06T04:54:26.213165Z", + "iopub.status.busy": "2026-08-06T04:54:26.213028Z", + "iopub.status.idle": "2026-08-06T04:54:26.216738Z", + "shell.execute_reply": "2026-08-06T04:54:26.216493Z" } }, "outputs": [ @@ -644,7 +644,7 @@ }, { "cell_type": "markdown", - "id": "a2586eac", + "id": "21268774", "metadata": {}, "source": [ "`dedup` blocks on `(reduced formula, space group)` before running pymatgen's\n", @@ -658,13 +658,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "9419a8ba", + "id": "6ef02b46", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:18.956476Z", - "iopub.status.busy": "2026-08-05T21:18:18.956387Z", - "iopub.status.idle": "2026-08-05T21:18:19.153030Z", - "shell.execute_reply": "2026-08-05T21:18:19.152515Z" + "iopub.execute_input": "2026-08-06T04:54:26.218477Z", + "iopub.status.busy": "2026-08-06T04:54:26.218345Z", + "iopub.status.idle": "2026-08-06T04:54:27.843788Z", + "shell.execute_reply": "2026-08-06T04:54:27.843421Z" } }, "outputs": [ @@ -774,7 +774,7 @@ }, { "cell_type": "markdown", - "id": "aca68bed", + "id": "f0d79c76", "metadata": {}, "source": [ "The relaxed geometry becomes its own variant, `relaxed_emt`, rather than\n", @@ -787,13 +787,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "3bb929a1", + "id": "fa676ec3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.154145Z", - "iopub.status.busy": "2026-08-05T21:18:19.154050Z", - "iopub.status.idle": "2026-08-05T21:18:19.156341Z", - "shell.execute_reply": "2026-08-05T21:18:19.155982Z" + "iopub.execute_input": "2026-08-06T04:54:27.844933Z", + "iopub.status.busy": "2026-08-06T04:54:27.844844Z", + "iopub.status.idle": "2026-08-06T04:54:27.847130Z", + "shell.execute_reply": "2026-08-06T04:54:27.846837Z" } }, "outputs": [ @@ -825,7 +825,7 @@ }, { "cell_type": "markdown", - "id": "f805c8b1", + "id": "84838104", "metadata": {}, "source": [ "`surrogate: True` and `license: 'LGPL-2.1'` are not decoration. The first is\n", @@ -839,13 +839,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "9f404a7e", + "id": "65f75f45", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.157228Z", - "iopub.status.busy": "2026-08-05T21:18:19.157143Z", - "iopub.status.idle": "2026-08-05T21:18:19.489385Z", - "shell.execute_reply": "2026-08-05T21:18:19.488884Z" + "iopub.execute_input": "2026-08-06T04:54:27.848064Z", + "iopub.status.busy": "2026-08-06T04:54:27.847981Z", + "iopub.status.idle": "2026-08-06T04:54:28.859679Z", + "shell.execute_reply": "2026-08-06T04:54:28.859255Z" } }, "outputs": [ @@ -955,7 +955,7 @@ }, { "cell_type": "markdown", - "id": "579c7890", + "id": "e06db49f", "metadata": {}, "source": [ "```{warning}\n", @@ -984,13 +984,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "e94b8af7", + "id": "f6c113b2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.490732Z", - "iopub.status.busy": "2026-08-05T21:18:19.490619Z", - "iopub.status.idle": "2026-08-05T21:18:19.645749Z", - "shell.execute_reply": "2026-08-05T21:18:19.645210Z" + "iopub.execute_input": "2026-08-06T04:54:28.860928Z", + "iopub.status.busy": "2026-08-06T04:54:28.860778Z", + "iopub.status.idle": "2026-08-06T04:54:29.054617Z", + "shell.execute_reply": "2026-08-06T04:54:29.054263Z" } }, "outputs": [ @@ -1016,7 +1016,7 @@ }, { "cell_type": "markdown", - "id": "0441587e", + "id": "c9e32a0b", "metadata": {}, "source": [ "The hull plot labels itself when the hull is closed, because a convex hull drawn\n", @@ -1031,13 +1031,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "ca6be7d2", + "id": "7ad28441", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.646793Z", - "iopub.status.busy": "2026-08-05T21:18:19.646694Z", - "iopub.status.idle": "2026-08-05T21:18:19.648979Z", - "shell.execute_reply": "2026-08-05T21:18:19.648620Z" + "iopub.execute_input": "2026-08-06T04:54:29.055520Z", + "iopub.status.busy": "2026-08-06T04:54:29.055426Z", + "iopub.status.idle": "2026-08-06T04:54:29.057784Z", + "shell.execute_reply": "2026-08-06T04:54:29.057532Z" } }, "outputs": [ @@ -1058,7 +1058,7 @@ }, { "cell_type": "markdown", - "id": "cbf3c744", + "id": "c7edfc92", "metadata": {}, "source": [ "The object records which kind of number you have, so a later reader does not\n", @@ -1090,13 +1090,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "ab2a9cc3", + "id": "0a4a1649", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.649786Z", - "iopub.status.busy": "2026-08-05T21:18:19.649701Z", - "iopub.status.idle": "2026-08-05T21:18:19.824001Z", - "shell.execute_reply": "2026-08-05T21:18:19.823490Z" + "iopub.execute_input": "2026-08-06T04:54:29.058541Z", + "iopub.status.busy": "2026-08-06T04:54:29.058458Z", + "iopub.status.idle": "2026-08-06T04:54:29.396248Z", + "shell.execute_reply": "2026-08-06T04:54:29.395657Z" } }, "outputs": [ @@ -1195,7 +1195,7 @@ }, { "cell_type": "markdown", - "id": "01b166d9", + "id": "3dfdde69", "metadata": {}, "source": [ "Three rows, three different answers, none of them small.\n", @@ -1224,13 +1224,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "a2477a17", + "id": "65857919", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.824960Z", - "iopub.status.busy": "2026-08-05T21:18:19.824867Z", - "iopub.status.idle": "2026-08-05T21:18:19.827199Z", - "shell.execute_reply": "2026-08-05T21:18:19.826721Z" + "iopub.execute_input": "2026-08-06T04:54:29.397205Z", + "iopub.status.busy": "2026-08-06T04:54:29.397063Z", + "iopub.status.idle": "2026-08-06T04:54:29.399232Z", + "shell.execute_reply": "2026-08-06T04:54:29.398980Z" } }, "outputs": [ @@ -1258,7 +1258,7 @@ }, { "cell_type": "markdown", - "id": "b35627e8", + "id": "98daccb4", "metadata": {}, "source": [ "### What it would cost, and whether you could get it\n", @@ -1270,13 +1270,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "83461386", + "id": "098c0d21", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:19.828416Z", - "iopub.status.busy": "2026-08-05T21:18:19.828323Z", - "iopub.status.idle": "2026-08-05T21:18:20.461392Z", - "shell.execute_reply": "2026-08-05T21:18:20.460775Z" + "iopub.execute_input": "2026-08-06T04:54:29.400012Z", + "iopub.status.busy": "2026-08-06T04:54:29.399873Z", + "iopub.status.idle": "2026-08-06T04:54:30.119787Z", + "shell.execute_reply": "2026-08-06T04:54:30.119473Z" } }, "outputs": [ @@ -1359,7 +1359,7 @@ }, { "cell_type": "markdown", - "id": "ddcfbf7f", + "id": "ad4443cd", "metadata": {}, "source": [ "`cost_per_kg` is raw-material cost from elemental prices — not synthesis, not\n", @@ -1379,13 +1379,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "f5ba859d", + "id": "274c6b03", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.462445Z", - "iopub.status.busy": "2026-08-05T21:18:20.462349Z", - "iopub.status.idle": "2026-08-05T21:18:20.490708Z", - "shell.execute_reply": "2026-08-05T21:18:20.490091Z" + "iopub.execute_input": "2026-08-06T04:54:30.120804Z", + "iopub.status.busy": "2026-08-06T04:54:30.120714Z", + "iopub.status.idle": "2026-08-06T04:54:30.146475Z", + "shell.execute_reply": "2026-08-06T04:54:30.146121Z" } }, "outputs": [ @@ -1407,7 +1407,7 @@ }, { "cell_type": "markdown", - "id": "69c063bc", + "id": "edb239e7", "metadata": {}, "source": [ "And since the diffraction pattern is on the same grid convention, a neutron\n", @@ -1418,7 +1418,7 @@ }, { "cell_type": "markdown", - "id": "08cbc035", + "id": "64cd2f91", "metadata": {}, "source": [ "### Stable, and stable *when*\n", @@ -1431,13 +1431,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "592c7b75", + "id": "659d16da", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.491705Z", - "iopub.status.busy": "2026-08-05T21:18:20.491614Z", - "iopub.status.idle": "2026-08-05T21:18:20.573622Z", - "shell.execute_reply": "2026-08-05T21:18:20.573196Z" + "iopub.execute_input": "2026-08-06T04:54:30.147391Z", + "iopub.status.busy": "2026-08-06T04:54:30.147274Z", + "iopub.status.idle": "2026-08-06T04:54:30.233378Z", + "shell.execute_reply": "2026-08-06T04:54:30.232452Z" } }, "outputs": [ @@ -1531,7 +1531,7 @@ }, { "cell_type": "markdown", - "id": "2e8a0b93", + "id": "bdd75ea7", "metadata": {}, "source": [ "`chempot_window` is the extent of the region in chemical potential space where\n", @@ -1563,13 +1563,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "322760f0", + "id": "462d280c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.574721Z", - "iopub.status.busy": "2026-08-05T21:18:20.574623Z", - "iopub.status.idle": "2026-08-05T21:18:20.577208Z", - "shell.execute_reply": "2026-08-05T21:18:20.576731Z" + "iopub.execute_input": "2026-08-06T04:54:30.234321Z", + "iopub.status.busy": "2026-08-06T04:54:30.234195Z", + "iopub.status.idle": "2026-08-06T04:54:30.236722Z", + "shell.execute_reply": "2026-08-06T04:54:30.236363Z" } }, "outputs": [ @@ -1591,7 +1591,7 @@ }, { "cell_type": "markdown", - "id": "f7f8b0e1", + "id": "eb376ece", "metadata": {}, "source": [ "It refuses without a key, and the message says why rather than returning zeros.\n", @@ -1604,7 +1604,7 @@ }, { "cell_type": "markdown", - "id": "68351400", + "id": "dff678f9", "metadata": {}, "source": [ "Ask for something light and not too far above the hull — two criteria that pull\n", @@ -1614,13 +1614,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "40998dd7", + "id": "fa6e9a42", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.578109Z", - "iopub.status.busy": "2026-08-05T21:18:20.578021Z", - "iopub.status.idle": "2026-08-05T21:18:20.580711Z", - "shell.execute_reply": "2026-08-05T21:18:20.580302Z" + "iopub.execute_input": "2026-08-06T04:54:30.237483Z", + "iopub.status.busy": "2026-08-06T04:54:30.237396Z", + "iopub.status.idle": "2026-08-06T04:54:30.240007Z", + "shell.execute_reply": "2026-08-06T04:54:30.239631Z" } }, "outputs": [ @@ -1646,13 +1646,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "10fd2e24", + "id": "0b44b884", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.581523Z", - "iopub.status.busy": "2026-08-05T21:18:20.581433Z", - "iopub.status.idle": "2026-08-05T21:18:20.586279Z", - "shell.execute_reply": "2026-08-05T21:18:20.585876Z" + "iopub.execute_input": "2026-08-06T04:54:30.240718Z", + "iopub.status.busy": "2026-08-06T04:54:30.240629Z", + "iopub.status.idle": "2026-08-06T04:54:30.245667Z", + "shell.execute_reply": "2026-08-06T04:54:30.245329Z" } }, "outputs": [ @@ -1760,13 +1760,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "29f8454b", + "id": "4d0bd38f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.587091Z", - "iopub.status.busy": "2026-08-05T21:18:20.587007Z", - "iopub.status.idle": "2026-08-05T21:18:20.718221Z", - "shell.execute_reply": "2026-08-05T21:18:20.717734Z" + "iopub.execute_input": "2026-08-06T04:54:30.246422Z", + "iopub.status.busy": "2026-08-06T04:54:30.246319Z", + "iopub.status.idle": "2026-08-06T04:54:30.378719Z", + "shell.execute_reply": "2026-08-06T04:54:30.378394Z" } }, "outputs": [ @@ -1806,7 +1806,7 @@ }, { "cell_type": "markdown", - "id": "6a47a261", + "id": "f742ac68", "metadata": {}, "source": [ "Cu and Ni sit at zero and are still grey — they failed on density, not on\n", @@ -1817,7 +1817,7 @@ }, { "cell_type": "markdown", - "id": "fcdea3ec", + "id": "6871aca6", "metadata": {}, "source": [ "The screen deposits a boolean column and the criteria that produced it. It does\n", @@ -1834,13 +1834,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "be280d86", + "id": "16b95743", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.719376Z", - "iopub.status.busy": "2026-08-05T21:18:20.719278Z", - "iopub.status.idle": "2026-08-05T21:18:20.725693Z", - "shell.execute_reply": "2026-08-05T21:18:20.725309Z" + "iopub.execute_input": "2026-08-06T04:54:30.379699Z", + "iopub.status.busy": "2026-08-06T04:54:30.379603Z", + "iopub.status.idle": "2026-08-06T04:54:30.387206Z", + "shell.execute_reply": "2026-08-06T04:54:30.386758Z" } }, "outputs": [ @@ -1957,7 +1957,7 @@ }, { "cell_type": "markdown", - "id": "20af8ee7", + "id": "a71e8391", "metadata": {}, "source": [ "`pareto_rank` keeps the second-best trade-offs reachable instead of discarding\n", @@ -1969,13 +1969,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "d86847a9", + "id": "76795fcc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.726656Z", - "iopub.status.busy": "2026-08-05T21:18:20.726566Z", - "iopub.status.idle": "2026-08-05T21:18:20.731664Z", - "shell.execute_reply": "2026-08-05T21:18:20.731250Z" + "iopub.execute_input": "2026-08-06T04:54:30.388095Z", + "iopub.status.busy": "2026-08-06T04:54:30.387989Z", + "iopub.status.idle": "2026-08-06T04:54:30.396485Z", + "shell.execute_reply": "2026-08-06T04:54:30.396168Z" } }, "outputs": [ @@ -2075,7 +2075,7 @@ }, { "cell_type": "markdown", - "id": "65af76b9", + "id": "96ed5a86", "metadata": {}, "source": [ "## Is the reaction downhill?\n", @@ -2088,13 +2088,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "7652a100", + "id": "849961e3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.732601Z", - "iopub.status.busy": "2026-08-05T21:18:20.732518Z", - "iopub.status.idle": "2026-08-05T21:18:20.735716Z", - "shell.execute_reply": "2026-08-05T21:18:20.735410Z" + "iopub.execute_input": "2026-08-06T04:54:30.397684Z", + "iopub.status.busy": "2026-08-06T04:54:30.397595Z", + "iopub.status.idle": "2026-08-06T04:54:30.401004Z", + "shell.execute_reply": "2026-08-06T04:54:30.400659Z" } }, "outputs": [ @@ -2121,7 +2121,7 @@ }, { "cell_type": "markdown", - "id": "99f14c57", + "id": "e82fc115", "metadata": {}, "source": [ "`favourable: False` and a positive energy — EMT again saying no intermetallic is\n", @@ -2133,13 +2133,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "b591584a", + "id": "f4c7eed3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.736756Z", - "iopub.status.busy": "2026-08-05T21:18:20.736669Z", - "iopub.status.idle": "2026-08-05T21:18:20.851705Z", - "shell.execute_reply": "2026-08-05T21:18:20.851289Z" + "iopub.execute_input": "2026-08-06T04:54:30.401760Z", + "iopub.status.busy": "2026-08-06T04:54:30.401650Z", + "iopub.status.idle": "2026-08-06T04:54:30.518219Z", + "shell.execute_reply": "2026-08-06T04:54:30.517782Z" } }, "outputs": [ @@ -2176,7 +2176,7 @@ }, { "cell_type": "markdown", - "id": "22127923", + "id": "f2c96af2", "metadata": {}, "source": [ "## What the object remembers" @@ -2185,13 +2185,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "0db3039f", + "id": "263638e0", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.852801Z", - "iopub.status.busy": "2026-08-05T21:18:20.852707Z", - "iopub.status.idle": "2026-08-05T21:18:20.854803Z", - "shell.execute_reply": "2026-08-05T21:18:20.854413Z" + "iopub.execute_input": "2026-08-06T04:54:30.519035Z", + "iopub.status.busy": "2026-08-06T04:54:30.518939Z", + "iopub.status.idle": "2026-08-06T04:54:30.521068Z", + "shell.execute_reply": "2026-08-06T04:54:30.520744Z" } }, "outputs": [ @@ -2222,13 +2222,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "c1abb18b", + "id": "c164a38e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:18:20.855584Z", - "iopub.status.busy": "2026-08-05T21:18:20.855501Z", - "iopub.status.idle": "2026-08-05T21:18:21.031151Z", - "shell.execute_reply": "2026-08-05T21:18:21.030712Z" + "iopub.execute_input": "2026-08-06T04:54:30.521748Z", + "iopub.status.busy": "2026-08-06T04:54:30.521667Z", + "iopub.status.idle": "2026-08-06T04:54:30.697443Z", + "shell.execute_reply": "2026-08-06T04:54:30.697018Z" } }, "outputs": [ @@ -2254,7 +2254,7 @@ }, { "cell_type": "markdown", - "id": "e1f3847e", + "id": "3d456bb8", "metadata": {}, "source": [ "Parameters are recorded with each call, so the history replays as code rather\n", diff --git a/matverse_guide/docs/tutorials/structure_and_bands.ipynb b/matverse_guide/docs/tutorials/structure_and_bands.ipynb index c2715f7..c6f8df1 100644 --- a/matverse_guide/docs/tutorials/structure_and_bands.ipynb +++ b/matverse_guide/docs/tutorials/structure_and_bands.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "65793f56", + "id": "ec92e9a0", "metadata": {}, "source": [ "# Local environments and electronic structure\n", @@ -26,13 +26,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "80527acb", + "id": "951d60b6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:13.824803Z", - "iopub.status.busy": "2026-08-05T21:22:13.824698Z", - "iopub.status.idle": "2026-08-05T21:22:23.784570Z", - "shell.execute_reply": "2026-08-05T21:22:23.784050Z" + "iopub.execute_input": "2026-08-06T04:59:40.815990Z", + "iopub.status.busy": "2026-08-06T04:59:40.815889Z", + "iopub.status.idle": "2026-08-06T04:59:52.761136Z", + "shell.execute_reply": "2026-08-06T04:59:52.760124Z" } }, "outputs": [ @@ -76,7 +76,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "73a680e0", + "id": "0f69f6af", "metadata": {}, "source": [ "That report is the point of `mv.pl.set_style` doing more than set rcParams:\n", @@ -111,13 +111,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "a45fcbdd", + "id": "6e81820e", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:23.786465Z", - "iopub.status.busy": "2026-08-05T21:22:23.785919Z", - "iopub.status.idle": "2026-08-05T21:22:23.848043Z", - "shell.execute_reply": "2026-08-05T21:22:23.847548Z" + "iopub.execute_input": "2026-08-06T04:59:52.762815Z", + "iopub.status.busy": "2026-08-06T04:59:52.762362Z", + "iopub.status.idle": "2026-08-06T04:59:52.790197Z", + "shell.execute_reply": "2026-08-06T04:59:52.789637Z" } }, "outputs": [ @@ -179,7 +179,7 @@ }, { "cell_type": "markdown", - "id": "22dc6d69", + "id": "731216cd", "metadata": {}, "source": [ "## Coordination: the sites axis again\n", @@ -191,13 +191,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "d6bd5f36", + "id": "3860a6bf", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:23.849278Z", - "iopub.status.busy": "2026-08-05T21:22:23.849150Z", - "iopub.status.idle": "2026-08-05T21:22:24.807252Z", - "shell.execute_reply": "2026-08-05T21:22:24.806797Z" + "iopub.execute_input": "2026-08-06T04:59:52.791342Z", + "iopub.status.busy": "2026-08-06T04:59:52.791198Z", + "iopub.status.idle": "2026-08-06T04:59:53.306663Z", + "shell.execute_reply": "2026-08-06T04:59:53.306394Z" } }, "outputs": [ @@ -227,7 +227,7 @@ }, { "cell_type": "markdown", - "id": "8ec84238", + "id": "2cf55c15", "metadata": {}, "source": [ "**Li 6, Fe 6, P 4, O 4** — the published olivine coordination, recovered from\n", @@ -242,13 +242,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "f296c799", + "id": "3145edfa", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:24.808376Z", - "iopub.status.busy": "2026-08-05T21:22:24.808252Z", - "iopub.status.idle": "2026-08-05T21:22:24.810570Z", - "shell.execute_reply": "2026-08-05T21:22:24.810188Z" + "iopub.execute_input": "2026-08-06T04:59:53.308287Z", + "iopub.status.busy": "2026-08-06T04:59:53.308113Z", + "iopub.status.idle": "2026-08-06T04:59:53.310510Z", + "shell.execute_reply": "2026-08-06T04:59:53.310111Z" } }, "outputs": [ @@ -274,13 +274,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "88bc4c30", + "id": "c339c101", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:24.811378Z", - "iopub.status.busy": "2026-08-05T21:22:24.811282Z", - "iopub.status.idle": "2026-08-05T21:22:24.916861Z", - "shell.execute_reply": "2026-08-05T21:22:24.916408Z" + "iopub.execute_input": "2026-08-06T04:59:53.311484Z", + "iopub.status.busy": "2026-08-06T04:59:53.311342Z", + "iopub.status.idle": "2026-08-06T04:59:53.364694Z", + "shell.execute_reply": "2026-08-06T04:59:53.364349Z" } }, "outputs": [ @@ -367,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "0ad8153f", + "id": "5b84ed4e", "metadata": {}, "source": [ "## A number is not a shape\n", @@ -382,13 +382,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "a5512f66", + "id": "c28b83bd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:24.926187Z", - "iopub.status.busy": "2026-08-05T21:22:24.926051Z", - "iopub.status.idle": "2026-08-05T21:22:26.146040Z", - "shell.execute_reply": "2026-08-05T21:22:26.145301Z" + "iopub.execute_input": "2026-08-06T04:59:53.366086Z", + "iopub.status.busy": "2026-08-06T04:59:53.365927Z", + "iopub.status.idle": "2026-08-06T04:59:54.330271Z", + "shell.execute_reply": "2026-08-06T04:59:54.318124Z" } }, "outputs": [ @@ -525,13 +525,13 @@ { "cell_type": "code", "execution_count": 7, - "id": "85910661", + "id": "8a9725fb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.147656Z", - "iopub.status.busy": "2026-08-05T21:22:26.147505Z", - "iopub.status.idle": "2026-08-05T21:22:26.152119Z", - "shell.execute_reply": "2026-08-05T21:22:26.151631Z" + "iopub.execute_input": "2026-08-06T04:59:54.331516Z", + "iopub.status.busy": "2026-08-06T04:59:54.331409Z", + "iopub.status.idle": "2026-08-06T04:59:54.335116Z", + "shell.execute_reply": "2026-08-06T04:59:54.334764Z" } }, "outputs": [ @@ -558,7 +558,7 @@ }, { "cell_type": "markdown", - "id": "25d76863", + "id": "f2d6af2f", "metadata": {}, "source": [ "This is the structural story of an olivine cathode, in one column.\n", @@ -575,13 +575,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "14a87046", + "id": "9f0e48fc", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.153124Z", - "iopub.status.busy": "2026-08-05T21:22:26.153005Z", - "iopub.status.idle": "2026-08-05T21:22:26.307006Z", - "shell.execute_reply": "2026-08-05T21:22:26.306297Z" + "iopub.execute_input": "2026-08-06T04:59:54.336421Z", + "iopub.status.busy": "2026-08-06T04:59:54.336327Z", + "iopub.status.idle": "2026-08-06T04:59:54.454073Z", + "shell.execute_reply": "2026-08-06T04:59:54.453576Z" } }, "outputs": [ @@ -624,7 +624,7 @@ }, { "cell_type": "markdown", - "id": "a29b5aae", + "id": "ff22f461", "metadata": {}, "source": [ "## The bond network belongs in `obsp`\n", @@ -637,13 +637,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "71813181", + "id": "541be7cb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.308209Z", - "iopub.status.busy": "2026-08-05T21:22:26.308074Z", - "iopub.status.idle": "2026-08-05T21:22:26.579472Z", - "shell.execute_reply": "2026-08-05T21:22:26.578990Z" + "iopub.execute_input": "2026-08-06T04:59:54.455405Z", + "iopub.status.busy": "2026-08-06T04:59:54.455252Z", + "iopub.status.idle": "2026-08-06T04:59:54.615000Z", + "shell.execute_reply": "2026-08-06T04:59:54.614626Z" } }, "outputs": [ @@ -667,13 +667,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "9866cee7", + "id": "bbe0e173", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.580832Z", - "iopub.status.busy": "2026-08-05T21:22:26.580622Z", - "iopub.status.idle": "2026-08-05T21:22:26.583719Z", - "shell.execute_reply": "2026-08-05T21:22:26.583373Z" + "iopub.execute_input": "2026-08-06T04:59:54.620406Z", + "iopub.status.busy": "2026-08-06T04:59:54.616693Z", + "iopub.status.idle": "2026-08-06T04:59:54.644838Z", + "shell.execute_reply": "2026-08-06T04:59:54.644375Z" } }, "outputs": [ @@ -695,7 +695,7 @@ }, { "cell_type": "markdown", - "id": "00dbd2fc", + "id": "25f56176", "metadata": {}, "source": [ "The degree of the graph is the coordination number, which it had better be.\n", @@ -712,13 +712,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "d0d7c406", + "id": "98177fa9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.584922Z", - "iopub.status.busy": "2026-08-05T21:22:26.584808Z", - "iopub.status.idle": "2026-08-05T21:22:26.603020Z", - "shell.execute_reply": "2026-08-05T21:22:26.602543Z" + "iopub.execute_input": "2026-08-06T04:59:54.645922Z", + "iopub.status.busy": "2026-08-06T04:59:54.645806Z", + "iopub.status.idle": "2026-08-06T04:59:54.651609Z", + "shell.execute_reply": "2026-08-06T04:59:54.651348Z" } }, "outputs": [ @@ -786,13 +786,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "d5db56b7", + "id": "4a14f5d5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.604138Z", - "iopub.status.busy": "2026-08-05T21:22:26.604021Z", - "iopub.status.idle": "2026-08-05T21:22:26.609293Z", - "shell.execute_reply": "2026-08-05T21:22:26.608871Z" + "iopub.execute_input": "2026-08-06T04:59:54.652848Z", + "iopub.status.busy": "2026-08-06T04:59:54.652679Z", + "iopub.status.idle": "2026-08-06T04:59:54.657218Z", + "shell.execute_reply": "2026-08-06T04:59:54.656792Z" } }, "outputs": [ @@ -848,7 +848,7 @@ }, { "cell_type": "markdown", - "id": "070ecb4e", + "id": "d8f05643", "metadata": {}, "source": [ "`coordination_spread` is the one worth screening on: zero means every atom sits\n", @@ -865,13 +865,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "996de827", + "id": "5ad8ea73", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:26.610355Z", - "iopub.status.busy": "2026-08-05T21:22:26.610235Z", - "iopub.status.idle": "2026-08-05T21:22:27.485715Z", - "shell.execute_reply": "2026-08-05T21:22:27.485210Z" + "iopub.execute_input": "2026-08-06T04:59:54.658194Z", + "iopub.status.busy": "2026-08-06T04:59:54.658033Z", + "iopub.status.idle": "2026-08-06T04:59:55.336876Z", + "shell.execute_reply": "2026-08-06T04:59:55.336590Z" } }, "outputs": [ @@ -937,7 +937,7 @@ }, { "cell_type": "markdown", - "id": "10f80233", + "id": "70c3ad0d", "metadata": {}, "source": [ "For an ion conductor this is the question. A framework whose octahedra share\n", @@ -973,13 +973,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "93ae9b73", + "id": "37890607", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.498882Z", - "iopub.status.busy": "2026-08-05T21:22:27.498643Z", - "iopub.status.idle": "2026-08-05T21:22:27.821342Z", - "shell.execute_reply": "2026-08-05T21:22:27.820938Z" + "iopub.execute_input": "2026-08-06T04:59:55.340851Z", + "iopub.status.busy": "2026-08-06T04:59:55.340658Z", + "iopub.status.idle": "2026-08-06T04:59:55.516012Z", + "shell.execute_reply": "2026-08-06T04:59:55.515624Z" } }, "outputs": [ @@ -1077,7 +1077,7 @@ }, { "cell_type": "markdown", - "id": "789436f9", + "id": "a0e2e109", "metadata": {}, "source": [ "Graphite 2D, diamond 3D, MoS2 2D — and `n_components` counts two layers per\n", @@ -1092,13 +1092,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "5ff6982c", + "id": "f77f66b5", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.822661Z", - "iopub.status.busy": "2026-08-05T21:22:27.822560Z", - "iopub.status.idle": "2026-08-05T21:22:27.827554Z", - "shell.execute_reply": "2026-08-05T21:22:27.827197Z" + "iopub.execute_input": "2026-08-06T04:59:55.517913Z", + "iopub.status.busy": "2026-08-06T04:59:55.517498Z", + "iopub.status.idle": "2026-08-06T04:59:55.527658Z", + "shell.execute_reply": "2026-08-06T04:59:55.523007Z" } }, "outputs": [ @@ -1170,7 +1170,7 @@ }, { "cell_type": "markdown", - "id": "0e695173", + "id": "a4c42e92", "metadata": {}, "source": [ "`dimensionality_strategy` is recorded next to the answer for the same reason\n", @@ -1189,13 +1189,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "ece9c9e8", + "id": "dc4403f4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.828309Z", - "iopub.status.busy": "2026-08-05T21:22:27.828215Z", - "iopub.status.idle": "2026-08-05T21:22:27.971652Z", - "shell.execute_reply": "2026-08-05T21:22:27.971237Z" + "iopub.execute_input": "2026-08-06T04:59:55.528930Z", + "iopub.status.busy": "2026-08-06T04:59:55.528535Z", + "iopub.status.idle": "2026-08-06T04:59:55.595824Z", + "shell.execute_reply": "2026-08-06T04:59:55.595272Z" } }, "outputs": [ @@ -1266,7 +1266,7 @@ }, { "cell_type": "markdown", - "id": "01230872", + "id": "03567b42", "metadata": {}, "source": [ "Γ–X–W–K–L–U, the standard fcc path. Note that Cu and Al get **different numbers\n", @@ -1292,13 +1292,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "489f9ea1", + "id": "d4e52411", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:27.973072Z", - "iopub.status.busy": "2026-08-05T21:22:27.972979Z", - "iopub.status.idle": "2026-08-05T21:22:28.054670Z", - "shell.execute_reply": "2026-08-05T21:22:28.054254Z" + "iopub.execute_input": "2026-08-06T04:59:55.597051Z", + "iopub.status.busy": "2026-08-06T04:59:55.596676Z", + "iopub.status.idle": "2026-08-06T04:59:55.670792Z", + "shell.execute_reply": "2026-08-06T04:59:55.670377Z" } }, "outputs": [ @@ -1346,7 +1346,7 @@ }, { "cell_type": "markdown", - "id": "49561169", + "id": "d050a48f", "metadata": {}, "source": [ "**Bands × k-points.** One row per band per spin per material, energies along a\n", @@ -1357,13 +1357,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "c6e9e824", + "id": "34918ccd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.056890Z", - "iopub.status.busy": "2026-08-05T21:22:28.056798Z", - "iopub.status.idle": "2026-08-05T21:22:28.063196Z", - "shell.execute_reply": "2026-08-05T21:22:28.062826Z" + "iopub.execute_input": "2026-08-06T04:59:55.672379Z", + "iopub.status.busy": "2026-08-06T04:59:55.671983Z", + "iopub.status.idle": "2026-08-06T04:59:55.680299Z", + "shell.execute_reply": "2026-08-06T04:59:55.680087Z" } }, "outputs": [ @@ -1517,13 +1517,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "b121cf80", + "id": "f3324180", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.065325Z", - "iopub.status.busy": "2026-08-05T21:22:28.065159Z", - "iopub.status.idle": "2026-08-05T21:22:28.068647Z", - "shell.execute_reply": "2026-08-05T21:22:28.068331Z" + "iopub.execute_input": "2026-08-06T04:59:55.683978Z", + "iopub.status.busy": "2026-08-06T04:59:55.683594Z", + "iopub.status.idle": "2026-08-06T04:59:55.688156Z", + "shell.execute_reply": "2026-08-06T04:59:55.687665Z" } }, "outputs": [ @@ -1596,7 +1596,7 @@ }, { "cell_type": "markdown", - "id": "7c28e733", + "id": "ef95980d", "metadata": {}, "source": [ "Two things about the axis are worth reading carefully.\n", @@ -1615,13 +1615,13 @@ { "cell_type": "code", "execution_count": 20, - "id": "2313cb8a", + "id": "1d8f57cd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.069665Z", - "iopub.status.busy": "2026-08-05T21:22:28.069505Z", - "iopub.status.idle": "2026-08-05T21:22:28.316002Z", - "shell.execute_reply": "2026-08-05T21:22:28.315507Z" + "iopub.execute_input": "2026-08-06T04:59:55.689308Z", + "iopub.status.busy": "2026-08-06T04:59:55.688925Z", + "iopub.status.idle": "2026-08-06T04:59:55.893900Z", + "shell.execute_reply": "2026-08-06T04:59:55.892772Z" } }, "outputs": [ @@ -1658,7 +1658,7 @@ }, { "cell_type": "markdown", - "id": "c5644256", + "id": "dd156683", "metadata": {}, "source": [ "## What the bands say\n", @@ -1670,13 +1670,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "750e7b5b", + "id": "c9985b22", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.317160Z", - "iopub.status.busy": "2026-08-05T21:22:28.317043Z", - "iopub.status.idle": "2026-08-05T21:22:28.324396Z", - "shell.execute_reply": "2026-08-05T21:22:28.323946Z" + "iopub.execute_input": "2026-08-06T04:59:55.895265Z", + "iopub.status.busy": "2026-08-06T04:59:55.895123Z", + "iopub.status.idle": "2026-08-06T04:59:55.918224Z", + "shell.execute_reply": "2026-08-06T04:59:55.917745Z" } }, "outputs": [ @@ -1755,7 +1755,7 @@ }, { "cell_type": "markdown", - "id": "a9c51ab8", + "id": "89346940", "metadata": {}, "source": [ "Metals, gap zero. Correct: two of the four bands cross the Fermi level, and a\n", @@ -1768,13 +1768,13 @@ { "cell_type": "code", "execution_count": 22, - "id": "9f25c5b5", + "id": "06ee946d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.325419Z", - "iopub.status.busy": "2026-08-05T21:22:28.325312Z", - "iopub.status.idle": "2026-08-05T21:22:28.384219Z", - "shell.execute_reply": "2026-08-05T21:22:28.383824Z" + "iopub.execute_input": "2026-08-06T04:59:55.919573Z", + "iopub.status.busy": "2026-08-06T04:59:55.919441Z", + "iopub.status.idle": "2026-08-06T04:59:55.968935Z", + "shell.execute_reply": "2026-08-06T04:59:55.968267Z" } }, "outputs": [ @@ -1869,7 +1869,7 @@ }, { "cell_type": "markdown", - "id": "7ca89de1", + "id": "527761f2", "metadata": {}, "source": [ "1.70 eV, which is exactly what the model was built with, and **direct** —\n", @@ -1943,13 +1943,13 @@ { "cell_type": "code", "execution_count": 23, - "id": "ef8056d7", + "id": "90fd3b53", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.385350Z", - "iopub.status.busy": "2026-08-05T21:22:28.385167Z", - "iopub.status.idle": "2026-08-05T21:22:28.413914Z", - "shell.execute_reply": "2026-08-05T21:22:28.413602Z" + "iopub.execute_input": "2026-08-06T04:59:55.969969Z", + "iopub.status.busy": "2026-08-06T04:59:55.969864Z", + "iopub.status.idle": "2026-08-06T04:59:56.030422Z", + "shell.execute_reply": "2026-08-06T04:59:56.029788Z" } }, "outputs": [ @@ -1972,7 +1972,7 @@ }, { "cell_type": "markdown", - "id": "0f3cebbd", + "id": "6b90733d", "metadata": {}, "source": [ "It names the install rather than returning zeros — and the docstring says why\n", @@ -1997,13 +1997,13 @@ { "cell_type": "code", "execution_count": 24, - "id": "f06f2f73", + "id": "ae37942f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:22:28.415521Z", - "iopub.status.busy": "2026-08-05T21:22:28.414734Z", - "iopub.status.idle": "2026-08-05T21:30:03.671791Z", - "shell.execute_reply": "2026-08-05T21:30:03.671271Z" + "iopub.execute_input": "2026-08-06T04:59:56.032167Z", + "iopub.status.busy": "2026-08-06T04:59:56.031540Z", + "iopub.status.idle": "2026-08-06T05:09:05.055506Z", + "shell.execute_reply": "2026-08-06T05:09:05.054932Z" } }, "outputs": [ @@ -2057,7 +2057,7 @@ }, { "cell_type": "markdown", - "id": "7f0a4cab", + "id": "e21eb04e", "metadata": {}, "source": [ "The first ratio is 1.00 and the second is 0.66, and **both are correct**. The\n", @@ -2086,13 +2086,13 @@ { "cell_type": "code", "execution_count": 25, - "id": "55a7eb1b", + "id": "a879b372", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:30:03.673385Z", - "iopub.status.busy": "2026-08-05T21:30:03.672994Z", - "iopub.status.idle": "2026-08-05T21:35:15.361600Z", - "shell.execute_reply": "2026-08-05T21:35:15.361012Z" + "iopub.execute_input": "2026-08-06T05:09:05.057357Z", + "iopub.status.busy": "2026-08-06T05:09:05.056491Z", + "iopub.status.idle": "2026-08-06T05:17:32.786460Z", + "shell.execute_reply": "2026-08-06T05:17:32.785965Z" } }, "outputs": [ @@ -2135,7 +2135,7 @@ }, { "cell_type": "markdown", - "id": "70f81c04", + "id": "0922da83", "metadata": {}, "source": [ "The left surface is a sphere. The right one is the same sphere at a higher Fermi\n", @@ -2150,13 +2150,13 @@ { "cell_type": "code", "execution_count": 26, - "id": "250a348d", + "id": "b6856563", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.367996Z", - "iopub.status.busy": "2026-08-05T21:35:15.367880Z", - "iopub.status.idle": "2026-08-05T21:35:15.370043Z", - "shell.execute_reply": "2026-08-05T21:35:15.369722Z" + "iopub.execute_input": "2026-08-06T05:17:32.792871Z", + "iopub.status.busy": "2026-08-06T05:17:32.792744Z", + "iopub.status.idle": "2026-08-06T05:17:32.795305Z", + "shell.execute_reply": "2026-08-06T05:17:32.794859Z" } }, "outputs": [ @@ -2178,7 +2178,7 @@ }, { "cell_type": "markdown", - "id": "d33c0da1", + "id": "7a98de3f", "metadata": {}, "source": [ "```{seealso}\n", @@ -2191,7 +2191,7 @@ }, { "cell_type": "markdown", - "id": "34f3a9dc", + "id": "df163a50", "metadata": {}, "source": [ "## How sure is a coordination number?\n", @@ -2207,13 +2207,13 @@ { "cell_type": "code", "execution_count": 27, - "id": "c240412f", + "id": "6b530ddd", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.370774Z", - "iopub.status.busy": "2026-08-05T21:35:15.370690Z", - "iopub.status.idle": "2026-08-05T21:35:15.841255Z", - "shell.execute_reply": "2026-08-05T21:35:15.840826Z" + "iopub.execute_input": "2026-08-06T05:17:32.796526Z", + "iopub.status.busy": "2026-08-06T05:17:32.796338Z", + "iopub.status.idle": "2026-08-06T05:17:33.264957Z", + "shell.execute_reply": "2026-08-06T05:17:33.264424Z" } }, "outputs": [ @@ -2358,7 +2358,7 @@ }, { "cell_type": "markdown", - "id": "adc30f69", + "id": "25456f9c", "metadata": {}, "source": [ "Sodium gets six faces and six neighbours, every weight 1.0 — nothing to decide.\n", @@ -2376,13 +2376,13 @@ { "cell_type": "code", "execution_count": 28, - "id": "a056a282", + "id": "6e64776c", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.842123Z", - "iopub.status.busy": "2026-08-05T21:35:15.842031Z", - "iopub.status.idle": "2026-08-05T21:35:15.866807Z", - "shell.execute_reply": "2026-08-05T21:35:15.866284Z" + "iopub.execute_input": "2026-08-06T05:17:33.266045Z", + "iopub.status.busy": "2026-08-06T05:17:33.265918Z", + "iopub.status.idle": "2026-08-06T05:17:33.292348Z", + "shell.execute_reply": "2026-08-06T05:17:33.291964Z" } }, "outputs": [ @@ -2408,7 +2408,7 @@ }, { "cell_type": "markdown", - "id": "e60ae8b7", + "id": "d73d6c0b", "metadata": {}, "source": [ "0.58 against 1.00. That is the column to sort on when auditing coordination\n", @@ -2419,7 +2419,7 @@ }, { "cell_type": "markdown", - "id": "5e2d4ebc", + "id": "03dccec3", "metadata": {}, "source": [ "## Who counts as a neighbour?\n", @@ -2435,13 +2435,13 @@ { "cell_type": "code", "execution_count": 29, - "id": "f34cef1f", + "id": "bfe2b010", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:15.867719Z", - "iopub.status.busy": "2026-08-05T21:35:15.867567Z", - "iopub.status.idle": "2026-08-05T21:35:16.510965Z", - "shell.execute_reply": "2026-08-05T21:35:16.510524Z" + "iopub.execute_input": "2026-08-06T05:17:33.293393Z", + "iopub.status.busy": "2026-08-06T05:17:33.293282Z", + "iopub.status.idle": "2026-08-06T05:17:33.923181Z", + "shell.execute_reply": "2026-08-06T05:17:33.922805Z" } }, "outputs": [ @@ -2578,7 +2578,7 @@ }, { "cell_type": "markdown", - "id": "a1701cb5", + "id": "7a89d064", "metadata": {}, "source": [ "Six and octahedral for every site, which is what rocksalt is.\n", @@ -2591,13 +2591,13 @@ { "cell_type": "code", "execution_count": 30, - "id": "2e14781f", + "id": "cb3ebb1d", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:16.511888Z", - "iopub.status.busy": "2026-08-05T21:35:16.511798Z", - "iopub.status.idle": "2026-08-05T21:35:16.701639Z", - "shell.execute_reply": "2026-08-05T21:35:16.701135Z" + "iopub.execute_input": "2026-08-06T05:17:33.924356Z", + "iopub.status.busy": "2026-08-06T05:17:33.924137Z", + "iopub.status.idle": "2026-08-06T05:17:34.129184Z", + "shell.execute_reply": "2026-08-06T05:17:34.128784Z" } }, "outputs": [ @@ -2699,7 +2699,7 @@ }, { "cell_type": "markdown", - "id": "cd5581d9", + "id": "fb4e01d9", "metadata": {}, "source": [ "Lower coordination, from an identical structure. A geometric criterion would\n", @@ -2725,7 +2725,7 @@ }, { "cell_type": "markdown", - "id": "c8381d23", + "id": "defe8dc6", "metadata": {}, "source": [ "## What photoemission actually sees\n", @@ -2743,13 +2743,13 @@ { "cell_type": "code", "execution_count": 31, - "id": "1ef0ecab", + "id": "0586a7ac", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:16.702594Z", - "iopub.status.busy": "2026-08-05T21:35:16.702447Z", - "iopub.status.idle": "2026-08-05T21:35:16.716912Z", - "shell.execute_reply": "2026-08-05T21:35:16.716515Z" + "iopub.execute_input": "2026-08-06T05:17:34.130350Z", + "iopub.status.busy": "2026-08-06T05:17:34.130238Z", + "iopub.status.idle": "2026-08-06T05:17:34.148544Z", + "shell.execute_reply": "2026-08-06T05:17:34.148050Z" } }, "outputs": [ @@ -2789,7 +2789,7 @@ }, { "cell_type": "markdown", - "id": "7dcc3089", + "id": "55f06007", "metadata": {}, "source": [ "Twenty, exactly the ratio of the two cross-sections. The oxygen states are\n", @@ -2804,13 +2804,13 @@ { "cell_type": "code", "execution_count": 32, - "id": "88376db2", + "id": "690e0e96", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:35:16.717882Z", - "iopub.status.busy": "2026-08-05T21:35:16.717691Z", - "iopub.status.idle": "2026-08-05T21:35:16.877935Z", - "shell.execute_reply": "2026-08-05T21:35:16.877451Z" + "iopub.execute_input": "2026-08-06T05:17:34.149483Z", + "iopub.status.busy": "2026-08-06T05:17:34.149359Z", + "iopub.status.idle": "2026-08-06T05:17:34.314409Z", + "shell.execute_reply": "2026-08-06T05:17:34.313921Z" } }, "outputs": [ @@ -2856,7 +2856,7 @@ }, { "cell_type": "markdown", - "id": "938ba253", + "id": "9f22f22f", "metadata": {}, "source": [ "```{note}\n", diff --git a/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb b/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb index 14bdc45..4791225 100644 --- a/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb +++ b/matverse_guide/docs/tutorials/surfaces_and_adsorption.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "4f47800d", + "id": "582af245", "metadata": {}, "source": [ "# Surfaces and adsorption\n", @@ -20,13 +20,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "3833836b", + "id": "992232bb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:31.596603Z", - "iopub.status.busy": "2026-08-05T21:19:31.596527Z", - "iopub.status.idle": "2026-08-05T21:19:36.737670Z", - "shell.execute_reply": "2026-08-05T21:19:36.737225Z" + "iopub.execute_input": "2026-08-06T04:56:26.077165Z", + "iopub.status.busy": "2026-08-06T04:56:26.077071Z", + "iopub.status.idle": "2026-08-06T04:56:31.624409Z", + "shell.execute_reply": "2026-08-06T04:56:31.623608Z" } }, "outputs": [ @@ -70,7 +70,7 @@ " / / / / / / /_/ / /_ | |/ / __/ / (__ ) __/\n", "/_/ /_/ /_/\\__,_/\\__/ |___/\\___/_/ /____/\\___/\n", "\n", - "🔖 Version: 0.1.71 🧮 Functions: 218 📚 Tutorials: https://matverse.readthedocs.io/\n", + "🔖 Version: 0.1.71 🧮 Functions: 225 📚 Tutorials: https://matverse.readthedocs.io/\n", "✅ set_style complete.\n", "\n" ] @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "7c5f174b", + "id": "60c3e19d", "metadata": {}, "source": [ "## Loading a dataset\n", @@ -99,13 +99,13 @@ { "cell_type": "code", "execution_count": 2, - "id": "1313621b", + "id": "e49d7f14", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.738980Z", - "iopub.status.busy": "2026-08-05T21:19:36.738631Z", - "iopub.status.idle": "2026-08-05T21:19:36.760167Z", - "shell.execute_reply": "2026-08-05T21:19:36.759824Z" + "iopub.execute_input": "2026-08-06T04:56:31.626169Z", + "iopub.status.busy": "2026-08-06T04:56:31.625666Z", + "iopub.status.idle": "2026-08-06T04:56:31.650599Z", + "shell.execute_reply": "2026-08-06T04:56:31.650133Z" } }, "outputs": [ @@ -173,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "22be3e65", + "id": "49300b8a", "metadata": {}, "source": [ "The bulk energy is not optional bookkeeping — a surface energy is the cost of\n", @@ -191,13 +191,13 @@ { "cell_type": "code", "execution_count": 3, - "id": "13ba3b80", + "id": "0357182a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.760982Z", - "iopub.status.busy": "2026-08-05T21:19:36.760886Z", - "iopub.status.idle": "2026-08-05T21:19:36.951571Z", - "shell.execute_reply": "2026-08-05T21:19:36.951221Z" + "iopub.execute_input": "2026-08-06T04:56:31.651634Z", + "iopub.status.busy": "2026-08-06T04:56:31.651483Z", + "iopub.status.idle": "2026-08-06T04:56:31.845001Z", + "shell.execute_reply": "2026-08-06T04:56:31.844523Z" } }, "outputs": [ @@ -225,13 +225,13 @@ { "cell_type": "code", "execution_count": 4, - "id": "be1ded90", + "id": "8cfab858", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.952372Z", - "iopub.status.busy": "2026-08-05T21:19:36.952279Z", - "iopub.status.idle": "2026-08-05T21:19:36.962697Z", - "shell.execute_reply": "2026-08-05T21:19:36.962371Z" + "iopub.execute_input": "2026-08-06T04:56:31.846034Z", + "iopub.status.busy": "2026-08-06T04:56:31.845914Z", + "iopub.status.idle": "2026-08-06T04:56:31.857299Z", + "shell.execute_reply": "2026-08-06T04:56:31.856848Z" } }, "outputs": [ @@ -346,7 +346,7 @@ }, { "cell_type": "markdown", - "id": "5a0790c6", + "id": "b0299b7b", "metadata": {}, "source": [ "More rows out than in, with `obs['parent']` pointing back at the bulk material —\n", @@ -362,13 +362,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "28eb8b36", + "id": "d4d89a06", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.963473Z", - "iopub.status.busy": "2026-08-05T21:19:36.963345Z", - "iopub.status.idle": "2026-08-05T21:19:36.965605Z", - "shell.execute_reply": "2026-08-05T21:19:36.965269Z" + "iopub.execute_input": "2026-08-06T04:56:31.858233Z", + "iopub.status.busy": "2026-08-06T04:56:31.858126Z", + "iopub.status.idle": "2026-08-06T04:56:31.860668Z", + "shell.execute_reply": "2026-08-06T04:56:31.860249Z" } }, "outputs": [ @@ -395,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "2d2999f1", + "id": "6bc242f8", "metadata": {}, "source": [ "## Surface energies" @@ -404,13 +404,13 @@ { "cell_type": "code", "execution_count": 6, - "id": "a597c78d", + "id": "714ec13b", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.966282Z", - "iopub.status.busy": "2026-08-05T21:19:36.966186Z", - "iopub.status.idle": "2026-08-05T21:19:36.988904Z", - "shell.execute_reply": "2026-08-05T21:19:36.988504Z" + "iopub.execute_input": "2026-08-06T04:56:31.861584Z", + "iopub.status.busy": "2026-08-06T04:56:31.861486Z", + "iopub.status.idle": "2026-08-06T04:56:31.885355Z", + "shell.execute_reply": "2026-08-06T04:56:31.884898Z" } }, "outputs": [ @@ -439,7 +439,7 @@ }, { "cell_type": "markdown", - "id": "914e77a5", + "id": "be6671a2", "metadata": {}, "source": [ "**(111) < (100) < (110)**, which is the literature ordering for copper and for\n", @@ -454,20 +454,20 @@ { "cell_type": "code", "execution_count": 7, - "id": "1907730d", + "id": "669c7d44", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:36.989729Z", - "iopub.status.busy": "2026-08-05T21:19:36.989621Z", - "iopub.status.idle": "2026-08-05T21:19:37.104506Z", - "shell.execute_reply": "2026-08-05T21:19:37.104100Z" + "iopub.execute_input": "2026-08-06T04:56:31.886249Z", + "iopub.status.busy": "2026-08-06T04:56:31.886140Z", + "iopub.status.idle": "2026-08-06T04:56:32.029127Z", + "shell.execute_reply": "2026-08-06T04:56:32.028707Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -507,7 +507,7 @@ }, { "cell_type": "markdown", - "id": "c0f6d9ca", + "id": "96adda73", "metadata": {}, "source": [ "## When a slab is not the bulk formula\n", @@ -526,13 +526,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "8e8dd196", + "id": "f6ac1538", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.105367Z", - "iopub.status.busy": "2026-08-05T21:19:37.105207Z", - "iopub.status.idle": "2026-08-05T21:19:37.274637Z", - "shell.execute_reply": "2026-08-05T21:19:37.274271Z" + "iopub.execute_input": "2026-08-06T04:56:32.030167Z", + "iopub.status.busy": "2026-08-06T04:56:32.030033Z", + "iopub.status.idle": "2026-08-06T04:56:32.232560Z", + "shell.execute_reply": "2026-08-06T04:56:32.232132Z" } }, "outputs": [ @@ -623,7 +623,7 @@ }, { "cell_type": "markdown", - "id": "5df98430", + "id": "3829f84e", "metadata": {}, "source": [ "Four of these five are not Cu₃Au. The leftover atoms have to come from somewhere\n", @@ -635,13 +635,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "ae120bd3", + "id": "78aaa2e4", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.275619Z", - "iopub.status.busy": "2026-08-05T21:19:37.275432Z", - "iopub.status.idle": "2026-08-05T21:19:37.280986Z", - "shell.execute_reply": "2026-08-05T21:19:37.280601Z" + "iopub.execute_input": "2026-08-06T04:56:32.233501Z", + "iopub.status.busy": "2026-08-06T04:56:32.233398Z", + "iopub.status.idle": "2026-08-06T04:56:32.239324Z", + "shell.execute_reply": "2026-08-06T04:56:32.238935Z" } }, "outputs": [ @@ -735,7 +735,7 @@ }, { "cell_type": "markdown", - "id": "61390270", + "id": "4350cf71", "metadata": {}, "source": [ "### Referencing the surplus to a reservoir\n", @@ -753,13 +753,13 @@ { "cell_type": "code", "execution_count": 10, - "id": "29a9d130", + "id": "a8b20ffe", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.281834Z", - "iopub.status.busy": "2026-08-05T21:19:37.281720Z", - "iopub.status.idle": "2026-08-05T21:19:37.824584Z", - "shell.execute_reply": "2026-08-05T21:19:37.824172Z" + "iopub.execute_input": "2026-08-06T04:56:32.240276Z", + "iopub.status.busy": "2026-08-06T04:56:32.240140Z", + "iopub.status.idle": "2026-08-06T04:56:32.834121Z", + "shell.execute_reply": "2026-08-06T04:56:32.833689Z" } }, "outputs": [ @@ -869,7 +869,7 @@ }, { "cell_type": "markdown", - "id": "211421b8", + "id": "69c0387c", "metadata": {}, "source": [ "Two things to read off. The two (100) terminations carry equal and opposite Au\n", @@ -890,13 +890,13 @@ { "cell_type": "code", "execution_count": 11, - "id": "bd0d8954", + "id": "238477d2", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.825472Z", - "iopub.status.busy": "2026-08-05T21:19:37.825371Z", - "iopub.status.idle": "2026-08-05T21:19:37.829854Z", - "shell.execute_reply": "2026-08-05T21:19:37.829571Z" + "iopub.execute_input": "2026-08-06T04:56:32.835289Z", + "iopub.status.busy": "2026-08-06T04:56:32.835165Z", + "iopub.status.idle": "2026-08-06T04:56:32.840448Z", + "shell.execute_reply": "2026-08-06T04:56:32.840020Z" } }, "outputs": [ @@ -955,7 +955,7 @@ }, { "cell_type": "markdown", - "id": "c671ac3c", + "id": "ac22b2d4", "metadata": {}, "source": [ "## The equilibrium crystal shape\n", @@ -969,13 +969,13 @@ { "cell_type": "code", "execution_count": 12, - "id": "622856f5", + "id": "8bc1e5c6", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.830601Z", - "iopub.status.busy": "2026-08-05T21:19:37.830515Z", - "iopub.status.idle": "2026-08-05T21:19:37.881740Z", - "shell.execute_reply": "2026-08-05T21:19:37.881412Z" + "iopub.execute_input": "2026-08-06T04:56:32.841254Z", + "iopub.status.busy": "2026-08-06T04:56:32.841150Z", + "iopub.status.idle": "2026-08-06T04:56:32.893898Z", + "shell.execute_reply": "2026-08-06T04:56:32.893459Z" } }, "outputs": [ @@ -1043,13 +1043,13 @@ { "cell_type": "code", "execution_count": 13, - "id": "0c4de04c", + "id": "b1b37ceb", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.882475Z", - "iopub.status.busy": "2026-08-05T21:19:37.882387Z", - "iopub.status.idle": "2026-08-05T21:19:37.886954Z", - "shell.execute_reply": "2026-08-05T21:19:37.886650Z" + "iopub.execute_input": "2026-08-06T04:56:32.894823Z", + "iopub.status.busy": "2026-08-06T04:56:32.894717Z", + "iopub.status.idle": "2026-08-06T04:56:32.900131Z", + "shell.execute_reply": "2026-08-06T04:56:32.899716Z" } }, "outputs": [ @@ -1121,7 +1121,7 @@ }, { "cell_type": "markdown", - "id": "01c3d3fb", + "id": "a2e33f4b", "metadata": {}, "source": [ "(111) takes **two thirds** of the surface, (100) most of the rest, and (110)\n", @@ -1141,13 +1141,13 @@ { "cell_type": "code", "execution_count": 14, - "id": "b8eaeee7", + "id": "c238f84a", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.887637Z", - "iopub.status.busy": "2026-08-05T21:19:37.887552Z", - "iopub.status.idle": "2026-08-05T21:19:37.889553Z", - "shell.execute_reply": "2026-08-05T21:19:37.889271Z" + "iopub.execute_input": "2026-08-06T04:56:32.901096Z", + "iopub.status.busy": "2026-08-06T04:56:32.900960Z", + "iopub.status.idle": "2026-08-06T04:56:32.903562Z", + "shell.execute_reply": "2026-08-06T04:56:32.903092Z" } }, "outputs": [ @@ -1171,13 +1171,13 @@ { "cell_type": "code", "execution_count": 15, - "id": "9fce1483", + "id": "112c4806", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.890195Z", - "iopub.status.busy": "2026-08-05T21:19:37.890116Z", - "iopub.status.idle": "2026-08-05T21:19:37.980964Z", - "shell.execute_reply": "2026-08-05T21:19:37.980613Z" + "iopub.execute_input": "2026-08-06T04:56:32.904531Z", + "iopub.status.busy": "2026-08-06T04:56:32.904412Z", + "iopub.status.idle": "2026-08-06T04:56:33.001664Z", + "shell.execute_reply": "2026-08-06T04:56:33.001155Z" } }, "outputs": [ @@ -1219,7 +1219,7 @@ }, { "cell_type": "markdown", - "id": "72535848", + "id": "3c9166ee", "metadata": {}, "source": [ "## Adsorption\n", @@ -1232,13 +1232,13 @@ { "cell_type": "code", "execution_count": 16, - "id": "d88cf272", + "id": "c5f7318f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:37.981930Z", - "iopub.status.busy": "2026-08-05T21:19:37.981804Z", - "iopub.status.idle": "2026-08-05T21:19:38.022762Z", - "shell.execute_reply": "2026-08-05T21:19:38.022390Z" + "iopub.execute_input": "2026-08-06T04:56:33.003406Z", + "iopub.status.busy": "2026-08-06T04:56:33.003257Z", + "iopub.status.idle": "2026-08-06T04:56:33.047824Z", + "shell.execute_reply": "2026-08-06T04:56:33.047345Z" } }, "outputs": [ @@ -1308,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "b82ec337", + "id": "ebb2843a", "metadata": {}, "source": [ "### Sites are enumerated, not guessed\n", @@ -1321,13 +1321,13 @@ { "cell_type": "code", "execution_count": 17, - "id": "6603d161", + "id": "4a90264f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.023537Z", - "iopub.status.busy": "2026-08-05T21:19:38.023442Z", - "iopub.status.idle": "2026-08-05T21:19:38.095661Z", - "shell.execute_reply": "2026-08-05T21:19:38.095357Z" + "iopub.execute_input": "2026-08-06T04:56:33.049041Z", + "iopub.status.busy": "2026-08-06T04:56:33.048908Z", + "iopub.status.idle": "2026-08-06T04:56:33.124677Z", + "shell.execute_reply": "2026-08-06T04:56:33.124080Z" } }, "outputs": [ @@ -1408,13 +1408,13 @@ { "cell_type": "code", "execution_count": 18, - "id": "fad6f44d", + "id": "778738c3", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.096485Z", - "iopub.status.busy": "2026-08-05T21:19:38.096395Z", - "iopub.status.idle": "2026-08-05T21:19:38.099345Z", - "shell.execute_reply": "2026-08-05T21:19:38.099010Z" + "iopub.execute_input": "2026-08-06T04:56:33.125934Z", + "iopub.status.busy": "2026-08-06T04:56:33.125559Z", + "iopub.status.idle": "2026-08-06T04:56:33.130192Z", + "shell.execute_reply": "2026-08-06T04:56:33.129657Z" } }, "outputs": [ @@ -1439,7 +1439,7 @@ }, { "cell_type": "markdown", - "id": "e8c64e65", + "id": "1fcef790", "metadata": {}, "source": [ "On-top, bridge and hollow — the three coordination environments a close-packed\n", @@ -1449,13 +1449,13 @@ { "cell_type": "code", "execution_count": 19, - "id": "4077fb16", + "id": "de86185f", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.100057Z", - "iopub.status.busy": "2026-08-05T21:19:38.099947Z", - "iopub.status.idle": "2026-08-05T21:19:38.436762Z", - "shell.execute_reply": "2026-08-05T21:19:38.436351Z" + "iopub.execute_input": "2026-08-06T04:56:33.131462Z", + "iopub.status.busy": "2026-08-06T04:56:33.131073Z", + "iopub.status.idle": "2026-08-06T04:56:33.761712Z", + "shell.execute_reply": "2026-08-06T04:56:33.761089Z" } }, "outputs": [ @@ -1484,7 +1484,7 @@ }, { "cell_type": "markdown", - "id": "c566e34a", + "id": "b8f89c84", "metadata": {}, "source": [ "**Hollow is lowest, then bridge, then on-top** — more neighbours, more bonding.\n", @@ -1501,20 +1501,20 @@ { "cell_type": "code", "execution_count": 20, - "id": "f4cdc12a", + "id": "742fc527", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.437666Z", - "iopub.status.busy": "2026-08-05T21:19:38.437572Z", - "iopub.status.idle": "2026-08-05T21:19:38.539003Z", - "shell.execute_reply": "2026-08-05T21:19:38.538627Z" + "iopub.execute_input": "2026-08-06T04:56:33.763008Z", + "iopub.status.busy": "2026-08-06T04:56:33.762609Z", + "iopub.status.idle": "2026-08-06T04:56:33.870507Z", + "shell.execute_reply": "2026-08-06T04:56:33.869812Z" } }, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 20, @@ -1552,7 +1552,7 @@ }, { "cell_type": "markdown", - "id": "2e32bbe0", + "id": "be186408", "metadata": {}, "source": [ "About 170 meV between on-top and hollow. That is the size of difference that\n", @@ -1561,7 +1561,7 @@ }, { "cell_type": "markdown", - "id": "88c5d021", + "id": "83f59104", "metadata": {}, "source": [ "```{warning}\n", @@ -1585,13 +1585,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "a646962e", + "id": "5cb205b9", "metadata": { "execution": { - "iopub.execute_input": "2026-08-05T21:19:38.539819Z", - "iopub.status.busy": "2026-08-05T21:19:38.539725Z", - "iopub.status.idle": "2026-08-05T21:19:38.541687Z", - "shell.execute_reply": "2026-08-05T21:19:38.541380Z" + "iopub.execute_input": "2026-08-06T04:56:33.871637Z", + "iopub.status.busy": "2026-08-06T04:56:33.871520Z", + "iopub.status.idle": "2026-08-06T04:56:33.874398Z", + "shell.execute_reply": "2026-08-06T04:56:33.873976Z" } }, "outputs": [ @@ -1615,7 +1615,7 @@ }, { "cell_type": "markdown", - "id": "df5b9b92", + "id": "0e28fff5", "metadata": {}, "source": [ "```{seealso}\n", diff --git a/tests/_contract_cases.py b/tests/_contract_cases.py index 6fed218..0bdd5b8 100644 --- a/tests/_contract_cases.py +++ b/tests/_contract_cases.py @@ -232,6 +232,58 @@ def fermi_computed(): return md +def lithium_metal(): + from pymatgen.core import Lattice, Structure + md = mv.data.from_structures([Structure( + Lattice.cubic(3.51), ["Li", "Li"], [[0, 0, 0], [.5, .5, .5]])]) + md.obs["energy_ref"] = [-3.7474] + return md + + +def olivine_pair(): + """LiFePO4 and its delithiated framework, with energies supplied.""" + cathode = mv.datasets.load("battery_cathodes")[:1].copy() + lithiated = mv.structures(cathode, "input")[0] + delithiated = lithiated.copy() + delithiated.remove_species(["Li"]) + md = mv.data.from_structures([lithiated, delithiated]) + md.obs_names = ["LiFePO4", "FePO4"] + md.obs["energy_ref"] = [-210.8473, -189.3663] + return md + + +def with_rdf(): + md = mv.datasets.load("simple")[:2].copy() + mv.pp.describe(md) + mv.prop.rdf(md, r_max=6.0, step=0.1) + return md + + +def vibrating(): + md = mv.datasets.metals(["Cu"]) + mv.pp.describe(md) + mv.prop.phonon(md, level="emt", supercell=(1, 1, 1)) + return md + + +def adsorbing(): + """Synthetic binding energies across a set of surfaces.""" + n = 6 + md = mv.data.from_compositions([f"Pt{i + 1}" for i in range(n)]) + oxygen = np.linspace(-2.5, 0.5, n) + md.obs["E_O"] = oxygen + md.obs["E_OH"] = 0.5 * oxygen - 0.10 + return md + + +def transporting(): + md = mv.data.from_compositions(["Bi2Te3"]) + md.obs["seebeck_x"] = [200e-6] + md.obs["sigma_over_tau_x"] = [1e18] + md.obs["thermal_conductivity_x"] = [1.0] + return md + + def symmetric(): """A dataset carrying obs['spacegroup_number'], for mv.pl.spacegroups.""" md = mv.datasets.metals(["Cu", "Al"]) @@ -951,6 +1003,18 @@ def measured_alloy(): (mv.gen.from_symmetry, perovskite_candidates, (), {"space_groups": [221], "seed": 0, "returns": "new"}), (mv.pl.spacegroups, symmetric, (), {}), + (mv.thermo.voltage, olivine_pair, (), + {"working_ion": "Li", "level": "ref", "reference": lithium_metal()}), + (mv.thermo.theoretical_capacity, olivine, (), {"working_ion": "Li"}), + (mv.prop.scattering, with_rdf, (), {"level": "calc", "q_max": 8.0, + "n_points": 20}), + (mv.prop.superconductivity, vibrating, (), + {"level": "emt", "coupling": 1.0}), + (mv.surf.scaling, adsorbing, (), {"x": "E_O", "y": "E_OH"}), + (mv.surf.volcano, adsorbing, (), + {"descriptor": "E_O", "optimum": -1.6}), + (mv.prop.zt, transporting, (), + {"level": "x", "relaxation_time": 1e-14}), (mv.pl.elastic, stiff, (), {"level": "exp"}), # Skipped where IFermi is absent, like any optional backend. (mv.pl.fermi_surface, fermi_computed, (), {"level": "model"}), diff --git a/tests/test_physics.py b/tests/test_physics.py index a681e2c..7547797 100644 --- a/tests/test_physics.py +++ b/tests/test_physics.py @@ -1540,3 +1540,406 @@ def test_it_needs_a_formula_column(self): [Structure(Lattice.cubic(4.0), ["Pb"], [[0, 0, 0]])]) with pytest.raises(ValueError, match="from_compositions"): mv.thermo.calphad(md, _pbsn_database(), temperature=450.0) + + +def _olivine_pair(): + """LiFePO4 and its delithiated framework, plus a lithium reference. + + The energies are supplied directly rather than computed, so the test says + something about the voltage arithmetic rather than about a potential. The + values are what CHGNet gives for a positions-only relaxation, which + reproduces the measured plateau. + """ + from pymatgen.core import Lattice, Structure + + lifepo4 = mv.datasets.load("battery_cathodes")[:1].copy() + lithiated = mv.structures(lifepo4, "input")[0] + delithiated = lithiated.copy() + delithiated.remove_species(["Li"]) + + cathode = mv.data.from_structures([lithiated, delithiated]) + cathode.obs_names = ["LiFePO4", "FePO4"] + cathode.obs["energy_ref"] = [-210.8473, -189.3663] + cathode.obs["relax_converged_ref"] = [True, True] + + metal = mv.data.from_structures([Structure( + Lattice.cubic(3.51), ["Li", "Li"], [[0, 0, 0], [.5, .5, .5]])]) + metal.obs["energy_ref"] = [-3.7474] + metal.obs["relax_converged_ref"] = [True] + return cathode, metal + + +class TestIntercalationVoltage: + """Checked against a measured plateau, not against another code. + + LiFePO4 discharges at 3.4-3.5 V with a theoretical capacity of 170 mAh/g. + Those are the numbers to hit. + """ + + def test_it_reproduces_the_lifepo4_plateau(self): + cathode, metal = _olivine_pair() + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + assert float(cathode.obs["voltage_ref"].iloc[0]) == \ + pytest.approx(3.5, abs=0.15) + assert float(cathode.obs["capacity_gravimetric_ref"].iloc[0]) == \ + pytest.approx(170.0, rel=0.02) + + def test_every_row_of_a_framework_carries_its_voltage(self): + """The voltage belongs to the pair, so both rows report it — a screen + sorting on the column should not have to know which row is which.""" + cathode, metal = _olivine_pair() + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + values = cathode.obs["voltage_ref"].to_numpy(dtype=float) + assert np.isfinite(values).all() + assert values[0] == pytest.approx(values[1]) + + def test_an_unconverged_row_is_excluded_not_averaged_in(self): + """The bug this was written after: reading energy_{level} without + checking relax_converged_{level} gave 78 V for LiFePO4, from a cell a + foundation potential had collapsed to 2 cubic angstrom per atom. The + diagnostic was False the whole time.""" + cathode, metal = _olivine_pair() + cathode.obs["relax_converged_ref"] = [True, False] + with pytest.warns(RuntimeWarning, match="did not converge"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + assert np.isnan(float(cathode.obs["voltage_ref"].iloc[0])) + assert "FePO4" in cathode.uns["electrode"]["ref"]["unconverged"] + + def test_an_unconverged_reference_is_refused_outright(self): + """A bad reference shifts every voltage by the same amount, so no + comparison between cathodes reveals it. That makes it worse than a bad + cathode, and it raises rather than warns.""" + cathode, metal = _olivine_pair() + metal.obs["relax_converged_ref"] = [False] + with pytest.raises(ValueError, match="reference did not converge"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + + def test_a_missing_reference_is_refused_rather_than_guessed(self): + cathode, _ = _olivine_pair() + with pytest.raises(ValueError, match="reference= is required"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref") + + def test_two_frameworks_are_not_averaged_together(self): + """Li and Na analogues of the same framework are different electrodes. + Grouping by what is left when the working ion is removed keeps them + apart; without it they become one meaningless average.""" + cathode, metal = _olivine_pair() + extra = mv.datasets.load("battery_cathodes")[1:2].copy() + merged = mv.data.from_structures( + list(mv.structures(cathode, "input")) + + list(mv.structures(extra, "input"))) + merged.obs_names = ["LiFePO4", "FePO4", "NaFePO4"] + merged.obs["energy_ref"] = [-210.8473, -189.3663, -205.0] + merged.obs["relax_converged_ref"] = [True, True, True] + with pytest.warns(RuntimeWarning, match="no voltage"): + mv.thermo.voltage(merged, working_ion="Li", level="ref", + reference=metal) + # The sodium analogue has no lithium pair, so it gets no voltage. + assert np.isnan(float(merged.obs["voltage_ref"].iloc[2])) + assert np.isfinite(float(merged.obs["voltage_ref"].iloc[0])) + + def test_it_needs_energies(self): + cathode, metal = _olivine_pair() + del cathode.obs["energy_ref"] + with pytest.raises(ValueError, match="mv.calc.relax"): + mv.thermo.voltage(cathode, working_ion="Li", level="ref", + reference=metal) + + +class TestScattering: + """S(q) and G(r) are definitions, so they can be checked against closed + forms rather than against another code.""" + + SIGMA = 3.0 + DENSITY = 0.05 + + @classmethod + def _hard_sphere(cls, step=0.005, r_max=20.0): + from matverse._core import deposit_grid + from pymatgen.core import Lattice, Structure + + side = (400 / cls.DENSITY) ** (1 / 3) + rng = np.random.default_rng(0) + cell = Structure(Lattice.cubic(side), ["Ar"] * 400, rng.random((400, 3))) + md = mv.data.from_structures([cell]) + r = np.arange(step, r_max, step) + g = np.where(r < cls.SIGMA, 0.0, 1.0) + deposit_grid(md, "rdf", "test", g[None, :], r, unit="angstrom") + return md, r + + @classmethod + def _analytic(cls, q): + """S(q) for a step g(r): 1 - 4 pi rho / q^3 [sin(qd) - qd cos(qd)].""" + d = cls.SIGMA + return 1.0 - 4 * np.pi * cls.DENSITY / q ** 3 * ( + np.sin(q * d) - q * d * np.cos(q * d)) + + def test_an_ideal_gas_has_a_structure_factor_of_one(self): + """g = 1 everywhere means no structure, and S(q) says so exactly.""" + from matverse._core import deposit_grid, grid_of + from pymatgen.core import Lattice, Structure + + cell = Structure(Lattice.cubic(20.0), ["Ar"], [[0, 0, 0]]) + md = mv.data.from_structures([cell]) + r = np.arange(0.01, 20.0, 0.005) + deposit_grid(md, "rdf", "ideal", np.ones((1, r.size)), r, + unit="angstrom") + mv.prop.scattering(md, level="ideal", q_max=12.0, n_points=40) + factor = md.obsm["structure_factor_ideal"][0] + assert factor == pytest.approx(np.ones_like(factor), abs=1e-6) + + def test_it_reproduces_the_hard_sphere_transform(self): + from matverse._core import grid_of + + md, _ = self._hard_sphere() + mv.prop.scattering(md, level="test", q_max=12.0, n_points=60) + q = grid_of(md, "structure_factor") + computed = md.obsm["structure_factor_test"][0] + assert np.abs(computed - self._analytic(q)).max() < 0.03 + + def test_the_error_follows_the_r_grid_it_was_given(self): + """The integral is quadrature on whatever mv.prop.rdf produced, so a + coarser step is a worse S(q) — linearly. Stated in the notes as 0.24, + 0.12, 0.048 and 0.012 for steps of 0.10, 0.05, 0.02 and 0.005, and + asserted here as monotone so the claim cannot rot.""" + from matverse._core import grid_of + + errors = [] + for step in (0.10, 0.02): + md, _ = self._hard_sphere(step=step) + mv.prop.scattering(md, level="test", q_max=12.0, n_points=60) + q = grid_of(md, "structure_factor") + errors.append(float(np.abs( + md.obsm["structure_factor_test"][0] - self._analytic(q)).max())) + assert errors[0] > errors[1] * 2 + + def test_the_reduced_pdf_is_the_definition(self): + """G(r) = 4 pi r rho [g(r) - 1], with nothing fitted.""" + md, r = self._hard_sphere() + mv.prop.scattering(md, level="test", q_max=12.0, n_points=20) + reduced = md.obsm["pdf_test"][0] + inside = r < self.SIGMA + assert reduced[inside] == pytest.approx( + -4 * np.pi * r[inside] * self.DENSITY, rel=1e-6) + assert reduced[r > self.SIGMA] == pytest.approx(0.0, abs=1e-12) + + def test_it_names_the_missing_step(self): + md = mv.data.from_compositions(["Ar"]) + with pytest.raises(ValueError, match="mv.prop.rdf"): + mv.prop.scattering(md, level="nothing") + + +class TestSuperconductivity: + """Half computed, half supplied, and the tests keep the halves apart.""" + + @staticmethod + def _with_dos(frequencies, weights=None, f_max=20.0, n=4000): + from matverse._core import deposit_grid + from pymatgen.core import Lattice, Structure + + grid = np.linspace(0.1, f_max, n) + density = np.zeros_like(grid) + for j, centre in enumerate(np.atleast_1d(frequencies)): + height = 1.0 if weights is None else weights[j] + density += height * np.exp(-0.5 * ((grid - centre) / 0.02) ** 2) + md = mv.data.from_structures( + [Structure(Lattice.cubic(3.6), ["Cu"], [[0, 0, 0]])]) + deposit_grid(md, "phonon_dos", "test", density[None, :], grid, + unit="THz") + return md + + def test_a_single_frequency_returns_itself(self): + """omega_log of a delta at w0 is w0, by construction.""" + for centre in (3.0, 8.0): + md = self._with_dos(centre) + mv.prop.superconductivity(md, level="test", coupling=1.0) + assert float(md.obs["omega_log_test"].iloc[0]) == \ + pytest.approx(centre, rel=1e-3) + + def test_the_soft_end_is_weighted_more(self): + """The 1/omega weighting puts the logarithmic average of 4 and 16 THz + below their geometric mean of 8.""" + md = self._with_dos([4.0, 16.0]) + mv.prop.superconductivity(md, level="test", coupling=1.0) + value = float(md.obs["omega_log_test"].iloc[0]) + assert value < 8.0 + assert value == pytest.approx(5.28, rel=0.02) + + def test_coupling_has_no_default(self): + """matverse cannot compute lambda, and a guessed one produces a + temperature that reads as a prediction.""" + md = self._with_dos(6.0) + with pytest.raises(ValueError, match="coupling="): + mv.prop.superconductivity(md, level="test") + + def test_tc_vanishes_at_the_formula_s_own_limit(self): + """As lambda approaches mu*(1 + 0.62 lambda) the exponent diverges. + That is where the formula stops having a solution, not where + superconductivity stops, and it returns exactly zero rather than an + overflow.""" + from matverse.prop import _allen_dynes + + assert _allen_dynes(0.10, 232.0, 252.0, 0.13) == 0.0 + assert _allen_dynes(0.05, 232.0, 252.0, 0.13) == 0.0 + assert _allen_dynes(1.00, 232.0, 252.0, 0.13) > 1.0 + + def test_the_strong_coupling_factors_are_included(self): + """Allen-Dynes with f1 and f2, not bare McMillan. They agree within a + few per cent at lambda = 0.5 and differ by a third at lambda = 3; + leaving them out is the usual reason a strong-coupling estimate comes + out low.""" + from matverse.prop import _allen_dynes + + def mcmillan(lam, w_log, mu=0.13): + return w_log / 1.2 * np.exp( + -1.04 * (1 + lam) / (lam - mu * (1 + 0.62 * lam))) + + weak = _allen_dynes(0.5, 100.0, 150.0, 0.13) / mcmillan(0.5, 100.0) + strong = _allen_dynes(3.0, 100.0, 150.0, 0.13) / mcmillan(3.0, 100.0) + assert weak == pytest.approx(1.0, abs=0.05) + assert strong > 1.25 + + def test_it_records_that_the_dos_stood_in_for_alpha2F(self): + md = self._with_dos(6.0) + mv.prop.superconductivity(md, level="test", coupling=1.0) + recorded = md.uns["superconductivity"]["test"] + assert "alpha^2 F" in recorded["spectral_function"] + assert "not computed here" in recorded["coupling_source"] + + +class TestCatalysisScaling: + """A scaling relation is a straight line, so a synthetic one with a known + slope says whether the fit is a fit.""" + + @staticmethod + def _surfaces(slope=0.5, intercept=-0.10, noise=0.02, n=8): + rng = np.random.default_rng(0) + oxygen = np.linspace(-2.5, 0.5, n) + md = mv.data.from_compositions([f"Pt{i + 1}" for i in range(n)]) + md.obs["E_O"] = oxygen + md.obs["E_OH"] = slope * oxygen + intercept + rng.normal(0, noise, n) + return md + + def test_it_recovers_a_known_slope(self): + md = self._surfaces() + mv.surf.scaling(md, x="E_O", y="E_OH") + fit = md.uns["scaling"]["fits"]["all"] + assert fit["slope"] == pytest.approx(0.5, abs=0.02) + assert fit["intercept_eV"] == pytest.approx(-0.10, abs=0.03) + assert fit["r_squared"] > 0.99 + + def test_the_residual_is_the_departure_from_the_line(self): + """The interesting column: a surface that beats the scaling ceiling + has to break the relation, so the residual is the candidate signal + and the fit is the background.""" + md = self._surfaces() + mv.surf.scaling(md, x="E_O", y="E_OH") + residual = md.obs["scaling_residual"].to_numpy(dtype=float) + predicted = (md.uns["scaling"]["fits"]["all"]["slope"] + * md.obs["E_O"].to_numpy(dtype=float) + + md.uns["scaling"]["fits"]["all"]["intercept_eV"]) + assert residual == pytest.approx( + md.obs["E_OH"].to_numpy(dtype=float) - predicted, abs=1e-9) + + def test_two_points_are_not_a_scaling_relation(self): + md = self._surfaces(n=2) + with pytest.raises(ValueError, match="not a scaling relation"): + mv.surf.scaling(md, x="E_O", y="E_OH") + + def test_a_missing_column_lists_what_is_there(self): + md = self._surfaces() + with pytest.raises(ValueError, match="mv.surf.adsorption_energy"): + mv.surf.scaling(md, x="E_O", y="E_nothing") + + +class TestVolcano: + @staticmethod + def _surfaces(): + md = mv.data.from_compositions([f"Pt{i + 1}" for i in range(8)]) + md.obs["E_O"] = np.linspace(-2.5, 0.5, 8) + return md + + def test_the_peak_sits_at_the_optimum(self): + md = self._surfaces() + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6) + best = int(np.argmax(md.obs["volcano_activity"].to_numpy(dtype=float))) + distances = np.abs(md.obs["distance_from_optimum"].to_numpy(float)) + assert best == int(np.argmin(distances)) + + def test_the_distance_is_signed_so_the_side_is_readable(self): + """Binding too weakly and too strongly are different problems, and a + magnitude cannot tell them apart.""" + md = self._surfaces() + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6) + offset = md.obs["distance_from_optimum"].to_numpy(dtype=float) + assert offset.min() < 0 < offset.max() + + def test_slopes_of_the_same_sign_are_refused(self): + """Two limbs with the same sign is a straight line dressed as a + peak.""" + md = self._surfaces() + with pytest.raises(ValueError, match="opposite"): + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6, + slopes=(1.0, 1.0)) + + def test_it_records_that_the_optimum_came_from_outside(self): + md = self._surfaces() + mv.surf.volcano(md, descriptor="E_O", optimum=-1.6) + assert "not derived here" in md.uns["volcano"]["optimum_source"] + + +class TestFigureOfMerit: + """zT needs a relaxation time nobody has. The ceiling does not, and that + is the point of computing it separately.""" + + @staticmethod + def _transport(seebeck=200e-6, sigma_over_tau=1e18, lattice=None): + md = mv.data.from_compositions(["Bi2Te3"]) + md.obs["seebeck_x"] = [seebeck] + md.obs["sigma_over_tau_x"] = [sigma_over_tau] + if lattice is not None: + md.obs["thermal_conductivity_x"] = [lattice] + return md + + def test_the_ceiling_needs_no_relaxation_time(self): + """tau cancels between sigma and the electronic thermal conductivity, + so S^2 / L survives not knowing it. At 200 microvolts per kelvin that + is 1.639.""" + md = self._transport(lattice=1.0) + mv.prop.zt(md, level="x", relaxation_time=1e-14, temperature=700.0) + assert float(md.obs["zt_ceiling_x"].iloc[0]) == \ + pytest.approx(1.639, rel=0.01) + + def test_zt_approaches_the_ceiling_as_the_lattice_stops_mattering(self): + """Checked across four decades of conductivity: 0.027, 0.24, 1.03, + 1.55 and then 1.6384 against an analytic 1.6393.""" + values = [] + for sigma in (1e17, 1e18, 1e19, 1e22): + md = self._transport(sigma_over_tau=sigma, lattice=1.0) + mv.prop.zt(md, level="x", relaxation_time=1e-14, temperature=700.0) + values.append(float(md.obs["zt_x"].iloc[0])) + assert values == sorted(values), "zT must rise with conductivity" + ceiling = float(md.obs["zt_ceiling_x"].iloc[0]) + assert values[-1] == pytest.approx(ceiling, rel=0.01) + assert values[-1] < ceiling, "the ceiling is approached, not crossed" + + def test_the_relaxation_time_has_no_default(self): + md = self._transport(lattice=1.0) + with pytest.raises(ValueError, match="relaxation_time="): + mv.prop.zt(md, level="x") + + def test_a_missing_lattice_conductivity_is_warned_about(self): + """Counting only the electronic part flatters every material, so the + omission is said out loud rather than absorbed.""" + md = self._transport() + with pytest.warns(RuntimeWarning, match="overestimate"): + mv.prop.zt(md, level="x", relaxation_time=1e-14) + + def test_it_needs_transport_first(self): + md = mv.data.from_compositions(["Bi2Te3"]) + with pytest.raises(ValueError, match="mv.elec.transport"): + mv.prop.zt(md, level="x", relaxation_time=1e-14)