diff --git a/CMakeLists.txt b/CMakeLists.txt index e04c823e952aa672af5441ab28cd4bfba272dd9a..0a671faaf9cd81a87a9aba0b0035f387b5bf5505 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ -cmake_minimum_required(VERSION 3.15...3.22) +cmake_minimum_required(VERSION 3.22) -project(eisgeneratorpy VERSION "1.0") +project(eisgenerator VERSION "1.0") if(SKBUILD) # Scikit-Build does not add your site-packages to the search path diff --git a/example/example.py b/example/example.py index ca9096b6fe3f170e68fa03f73c4f0c39b05c986c..0e4212ec33a6ed444e686dcda6388d5cbb6279a1 100755 --- a/example/example.py +++ b/example/example.py @@ -1,35 +1,27 @@ #!/bin/python -import eisgeneratorpy as eis +import eisgenerator as eis -def printData(data): - print('Omega, Re, Im') - for i in data: - print(f'{i.omega},{i.im.real},{i.im.imag}') +model = eis.Model("c{1e-6}r{1e3}") +print(f"model: {model}") -model = eis.Model("C{1e-6}R{1e3}") - -eis.Log.level = eis.Log.level.DEBUG +eis.Log.level = eis.Log.level.WARN print(f'set log level: {eis.Log.level}') with eis.ostream_redirect(stdout=True, stderr=True): data = model.execute(1e6) -print(data.im) +print(f"data for omega={data.omega}: {data}") -ranges = list([]) -neededParameters = model.getFlatParametersCount() -for i in range(neededParameters): - ranges.append(eis.Range(1, 1000, 1000, True)) +model = eis.Model("c{1e-6~1e-5}r{1e3~1e4}") omegaRange = eis.Range(1, 1000, 25, True) -print('Ranges:') -for eisRange in ranges: - print(f'{eisRange.start} {eisRange.end} {eisRange.count}') - -neededIterations = model.getRequiredStepsForSweeps(list(ranges)) +neededIterations = model.getRequiredStepsForSweeps() print(f'will need {neededIterations} iterations') -for i in range(neededIterations): - #print(f'Spectra {i}:') - sweep = model.executeParamByIndex(ranges, omegaRange, i) - #printData(sweep) +sweeps = model.executeAllSweeps(omegaRange) + +spectra = eis.EisSpectra() +spectra.data = sweeps[200] +spectra.model = model.getModelStrWithParam(200) + +print(spectra) diff --git a/setup.py b/setup.py index a7480648d6ce9667e430ae2658257d0ca7c58492..dd602f6eeb8ab97da64b59f7d0d7e9a5233c9c51 100644 --- a/setup.py +++ b/setup.py @@ -13,14 +13,14 @@ except ImportError: from setuptools import find_packages setup( - name="eisgeneratorpy", - version="0.0.1", - description="a minimal example package (with pybind11)", - author="Henry Schreiner", - license="MIT", + name="eisgenerator", + version="1.0.0", + description="", + author="Carl Philipp Klemm", + license="LGPL-3.0", packages=find_packages(where="src"), package_dir={"": "src"}, - cmake_install_dir="src/eisgeneratorpy", + cmake_install_dir="src/eisgenerator", include_package_data=True, - python_requires=">=3.6", + python_requires=">=3.8", ) diff --git a/src/eisgenerator/__init__.py b/src/eisgenerator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2186174b276d5bfae753aee4f1f8683fd241aabd --- /dev/null +++ b/src/eisgenerator/__init__.py @@ -0,0 +1 @@ +from ._core import __doc__, __version__, Model, DataPoint, Range, Log, ParseError, FileError, eisDistance, EisSpectra, eisNyquistDistance, ostream_redirect diff --git a/src/eisgeneratorpy/__init__.py b/src/eisgeneratorpy/__init__.py deleted file mode 100644 index 1255adf9b0df6a52086f95db4b5e70ce31394c48..0000000000000000000000000000000000000000 --- a/src/eisgeneratorpy/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ._core import __doc__, __version__, Model, DataPoint, Range, Log, ostream_redirect diff --git a/src/main.cpp b/src/main.cpp index a65f0fc70c01b916b945b042ba36f2c86f9d7431..1edfbc1c7df244f70ec20093927364a57bc45ded 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,23 +8,58 @@ #include <eisgenerator/eistype.h> #include <eisgenerator/log.h> #include <vector> +#include <sstream> namespace py = pybind11; using namespace eis; +std::string reprEisSpectra(const EisSpectra& spectra) +{ + std::stringstream ss; + spectra.saveToStream(ss); + return ss.str(); +} + +std::string reprDataPoint(const DataPoint& dp) +{ + std::stringstream ss; + ss<<std::scientific; + ss<<'('<<dp.im.real()<<'+'<<dp.im.imag()<<"j)"; + return ss.str(); +} + PYBIND11_MODULE(_core, m) { py::class_<Model>(m, "Model") - .def(py::init<const std::string&>()) - .def("execute", &Model::execute) - .def("executeSweep", &Model::executeSweep) - .def("executeParamByIndex", &Model::executeParamByIndex) - .def_static("getRequiredStepsForSweeps", &Model::getRequiredStepsForSweeps) - .def("getFlatParametersCount", &Model::getFlatParametersCount); + .def(py::init<const std::string&, size_t, bool>(), + py::arg("str"), py::arg("paramSweepCount") = 100, py::arg("defaultToRange") = false) + .def("execute", &Model::execute, py::arg("omaga"), py::arg("omaga") = 0) + .def("executeSweep", static_cast<std::vector<DataPoint> (Model::*)(const std::vector<fvalue>&, size_t)>(&Model::executeSweep), + py::arg("omega"), py::arg("index") = 0) + .def("executeAllSweeps", &Model::executeAllSweeps) + .def("getModelStr", &Model::getModelStr) + .def("getModelStrWithParam", static_cast<std::string (Model::*)(size_t)>(&Model::getModelStrWithParam), + py::arg("index") = 0) + .def("getUuid", &Model::getUuid) + .def("compile", &Model::compile) + .def("isReady", &Model::isReady) + .def("resolveSteps", &Model::resolveSteps) + .def("getRequiredStepsForSweeps", &Model::getRequiredStepsForSweeps) + .def("getCppCode", &Model::getCode) + .def("getTorchScript", &Model::getTorchScript) + .def("getCompiledFunctionName", &Model::getCompiledFunctionName) + .def("__repr__", &Model::getModelStr); py::class_<DataPoint>(m, "DataPoint") + .def(py::init<std::complex<fvalue>, fvalue>(), py::arg("im") = std::complex<fvalue>(0, 0), py::arg("omega") = 100) .def_readwrite("omega", &DataPoint::omega) - .def_readwrite("im", &DataPoint::im); + .def_readwrite("im", &DataPoint::im) + .def("__gt__", &DataPoint::operator>) + .def("__lt__", &DataPoint::operator<) + .def("__eq__", &DataPoint::operator==) + .def("__add__", &DataPoint::operator+) + .def("complexVectorLength", &DataPoint::complexVectorLength) + .def("__repr__", &reprDataPoint); py::class_<Range>(m, "Range") .def(py::init<fvalue, fvalue, size_t, bool>(), py::arg("startI"), @@ -34,7 +69,31 @@ PYBIND11_MODULE(_core, m) .def_readwrite("start", &Range::start) .def_readwrite("end", &Range::end) .def_readwrite("count", &Range::count) - .def_readwrite("log", &Range::log); + .def_readwrite("log", &Range::log) + .def("stepSize", &Range::stepSize) + .def("stepValue", &Range::stepValue) + .def("center", &Range::center) + .def("at", &Range::at) + .def("__getitem__", &Range::at) + .def("getString", &Range::getString) + .def("getRangeVector", &Range::getRangeVector) + .def("fromString", &Range::fromString) + .def_static("rangesFromParamString", &Range::rangesFromParamString); + py::class_<EisSpectra>(m, "EisSpectra") + .def(py::init<>()) + .def_readwrite("data", &EisSpectra::data) + .def_readwrite("model", &EisSpectra::model) + .def_readwrite("header", &EisSpectra::header) + .def_readwrite("labels", &EisSpectra::labels) + .def_readwrite("labelNames", &EisSpectra::labelNames) + .def_static("loadFromDisk", &EisSpectra::loadFromDisk) + .def("setLabel", &EisSpectra::setLabel) + .def("setSzLabels", &EisSpectra::setSzLabels) + .def("setLabels", static_cast<void (EisSpectra::*)(const std::vector<double>&)>(&EisSpectra::setLabels)) + .def("getSzLabels", &EisSpectra::getSzLabels) + .def("getFvalueLabels", &EisSpectra::getFvalueLabels) + .def("saveToDisk", &EisSpectra::saveToDisk) + .def("__repr__", &reprEisSpectra); py::class_<Log>(m, "Log") .def_readwrite_static("level", &Log::level); py::enum_<Log::Level>(m, "Level") @@ -42,6 +101,10 @@ PYBIND11_MODULE(_core, m) .value("INFO", Log::INFO) .value("WARN", Log::WARN) .value("ERROR", Log::ERROR); + py::register_exception<parse_errror>(m, "ParseError"); + py::register_exception<file_error>(m, "FileError"); py::add_ostream_redirect(m, "ostream_redirect"); + m.def("eisDistance", &eisDistance); + m.def("eisNyquistDistance", &eisNyquistDistance); m.attr("__version__") = "1.0"; }