mirror of
https://github.com/TREX-CoE/trexio.git
synced 2025-01-09 20:48:53 +01:00
add Python front end
This commit is contained in:
parent
66a790717a
commit
2be1abd571
@ -10,6 +10,7 @@ echo "" >> trexio.h
|
|||||||
|
|
||||||
cat prefix_s_front.h > trexio_s.h
|
cat prefix_s_front.h > trexio_s.h
|
||||||
cat prefix_fortran.f90 > trexio_f.f90
|
cat prefix_fortran.f90 > trexio_f.f90
|
||||||
|
cat prefix_python.py > trexio.py
|
||||||
|
|
||||||
# c front end
|
# c front end
|
||||||
cat populated/pop_*.c >> trexio.c
|
cat populated/pop_*.c >> trexio.c
|
||||||
@ -21,6 +22,9 @@ cat populated/pop_*.f90 >> trexio_f.f90
|
|||||||
cat helper_fortran.f90 >> trexio_f.f90
|
cat helper_fortran.f90 >> trexio_f.f90
|
||||||
cat populated/pop_*.fh_90 >> trexio_f.f90
|
cat populated/pop_*.fh_90 >> trexio_f.f90
|
||||||
|
|
||||||
|
# python front end
|
||||||
|
cat populated/pop_*.py >> trexio.py
|
||||||
|
|
||||||
# suffixes
|
# suffixes
|
||||||
cat suffix_s_front.h >> trexio_s.h
|
cat suffix_s_front.h >> trexio_s.h
|
||||||
cat suffix_front.h >> trexio.h
|
cat suffix_front.h >> trexio.h
|
||||||
|
@ -12,13 +12,29 @@
|
|||||||
#+NAME:header
|
#+NAME:header
|
||||||
#+begin_src c
|
#+begin_src c
|
||||||
/* This file was generated from the templator_front.org org-mode file.
|
/* This file was generated from the templator_front.org org-mode file.
|
||||||
To generate it, open trexio.org in Emacs and execute
|
To generate it, open templator_front.org in Emacs and execute
|
||||||
M-x org-babel-tangle
|
M-x org-babel-tangle
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src f90 :tangle prefix_fortran.f90 :noweb yes
|
** Python
|
||||||
|
#+begin_src python :tangle prefix_python.py
|
||||||
|
|
||||||
|
# define TREXIO back ends
|
||||||
|
TREXIO_HDF5 = 0
|
||||||
|
TREXIO_TEXT = 1
|
||||||
|
#TREXIO_JSON = 2
|
||||||
|
TREXIO_INVALID_BACK_END = 2
|
||||||
|
|
||||||
|
# define max length of string item when reading arrays of strings
|
||||||
|
# this is needed for the low-level C routines
|
||||||
|
PYTREXIO_MAX_STR_LENGTH = 2048
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
** Fortran
|
||||||
|
#+begin_src f90 :tangle prefix_fortran.f90
|
||||||
module trexio
|
module trexio
|
||||||
|
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
@ -33,10 +49,10 @@ module trexio
|
|||||||
integer(trexio_backend), parameter :: TREXIO_INVALID_BACK_END = 2
|
integer(trexio_backend), parameter :: TREXIO_INVALID_BACK_END = 2
|
||||||
|
|
||||||
character(kind=c_char), parameter :: TREXIO_DELIM = c_new_line
|
character(kind=c_char), parameter :: TREXIO_DELIM = c_new_line
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
** C
|
||||||
#+begin_src c :tangle prefix_front.h :noweb yes
|
#+begin_src c :tangle prefix_front.h :noweb yes
|
||||||
<<header>>
|
<<header>>
|
||||||
#ifndef TREXIO_H
|
#ifndef TREXIO_H
|
||||||
@ -177,6 +193,15 @@ for (text, code,_) in table:
|
|||||||
result += [ f" integer(trexio_exit_code), parameter :: {text:30s} = {code:d}" ]
|
result += [ f" integer(trexio_exit_code), parameter :: {text:30s} = {code:d}" ]
|
||||||
result += [ "#+end_src" ]
|
result += [ "#+end_src" ]
|
||||||
|
|
||||||
|
result += [ "" ]
|
||||||
|
|
||||||
|
result += [ "#+begin_src python :tangle prefix_python.py :exports none" ]
|
||||||
|
result += [ "# define TREXIO exit codes" ]
|
||||||
|
for (text, code,_) in table:
|
||||||
|
text=text.replace("~","")
|
||||||
|
result += [ f"{text:30s} = {code:d}" ]
|
||||||
|
result += [ "#+end_src" ]
|
||||||
|
|
||||||
return '\n'.join(result)
|
return '\n'.join(result)
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
@ -241,14 +266,44 @@ return '\n'.join(result)
|
|||||||
integer(trexio_exit_code), parameter :: TREXIO_UNSAFE_ARRAY_DIM = 23
|
integer(trexio_exit_code), parameter :: TREXIO_UNSAFE_ARRAY_DIM = 23
|
||||||
integer(trexio_exit_code), parameter :: TREXIO_INVALID_STR_LEN = 30
|
integer(trexio_exit_code), parameter :: TREXIO_INVALID_STR_LEN = 30
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src python :tangle prefix_python.py :exports none
|
||||||
|
TREXIO_FAILURE = -1
|
||||||
|
TREXIO_SUCCESS = 0
|
||||||
|
TREXIO_INVALID_ARG_1 = 1
|
||||||
|
TREXIO_INVALID_ARG_2 = 2
|
||||||
|
TREXIO_INVALID_ARG_3 = 3
|
||||||
|
TREXIO_INVALID_ARG_4 = 4
|
||||||
|
TREXIO_INVALID_ARG_5 = 5
|
||||||
|
TREXIO_END = 6
|
||||||
|
TREXIO_READONLY = 7
|
||||||
|
TREXIO_ERRNO = 8
|
||||||
|
TREXIO_INVALID_ID = 9
|
||||||
|
TREXIO_ALLOCATION_FAILED = 10
|
||||||
|
TREXIO_HAS_NOT = 11
|
||||||
|
TREXIO_INVALID_NUM = 12
|
||||||
|
TREXIO_ATTR_ALREADY_EXISTS = 13
|
||||||
|
TREXIO_DSET_ALREADY_EXISTS = 14
|
||||||
|
TREXIO_OPEN_ERROR = 15
|
||||||
|
TREXIO_LOCK_ERROR = 16
|
||||||
|
TREXIO_UNLOCK_ERROR = 17
|
||||||
|
TREXIO_FILE_ERROR = 18
|
||||||
|
TREXIO_GROUP_READ_ERROR = 19
|
||||||
|
TREXIO_GROUP_WRITE_ERROR = 20
|
||||||
|
TREXIO_ELEM_READ_ERROR = 21
|
||||||
|
TREXIO_ELEM_WRITE_ERROR = 22
|
||||||
|
TREXIO_UNSAFE_ARRAY_DIM = 23
|
||||||
|
TREXIO_INVALID_STR_LEN = 30
|
||||||
|
#+end_src
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
|
|
||||||
|
*** Decoding errors
|
||||||
|
|
||||||
The ~trexio_string_of_error~ converts an exit code into a string. The
|
The ~trexio_string_of_error~ converts an exit code into a string. The
|
||||||
string is assumed to be large enough to contain the error message
|
string is assumed to be large enough to contain the error message
|
||||||
(typically 128 characters).
|
(typically 128 characters).
|
||||||
|
|
||||||
◉ Decoding errors
|
|
||||||
|
|
||||||
To decode the error messages, ~trexio_string_of_error~ converts an
|
To decode the error messages, ~trexio_string_of_error~ converts an
|
||||||
error code into a string.
|
error code into a string.
|
||||||
|
|
||||||
@ -659,6 +714,22 @@ interface
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle prefix_python.py
|
||||||
|
def open(file_name: str, mode: str, back_end: int):
|
||||||
|
try:
|
||||||
|
from pytrexio import trexio_open
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
trexio_file = trexio_open(file_name, mode, back_end)
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
return trexio_file
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
Because arrays are zero-based in Fortran, we need to set a flag to
|
Because arrays are zero-based in Fortran, we need to set a flag to
|
||||||
know if we need to shift by 1 arrays of indices.
|
know if we need to shift by 1 arrays of indices.
|
||||||
|
|
||||||
@ -776,6 +847,21 @@ interface
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src c :tangle prefix_python.py
|
||||||
|
def close(trexio_file):
|
||||||
|
try:
|
||||||
|
from pytrexio import trexio_close, trexio_string_of_error, TREXIO_SUCCESS
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = trexio_close(trexio_file)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
* Templates for front end
|
* Templates for front end
|
||||||
** Description
|
** Description
|
||||||
|
|
||||||
@ -1119,6 +1205,43 @@ interface
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Python templates for front end
|
||||||
|
|
||||||
|
#+begin_src python :tangle write_num_front.py
|
||||||
|
def write_$group_num$(trexio_file, num_w) -> None:
|
||||||
|
try:
|
||||||
|
from pytrexio import trexio_write_$group_num$, trexio_string_of_error, TREXIO_SUCCESS
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = trexio_write_$group_num$(trexio_file, num_w)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src python :tangle read_num_front.py
|
||||||
|
def read_$group_num$(trexio_file):
|
||||||
|
try:
|
||||||
|
from pytrexio import trexio_read_$group_num$, trexio_string_of_error, TREXIO_SUCCESS
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc, num_r = trexio_read_$group_num$(trexio_file)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
return num_r
|
||||||
|
#+end_src
|
||||||
|
|
||||||
** Templates for front end has/read/write a dataset of numerical data
|
** Templates for front end has/read/write a dataset of numerical data
|
||||||
|
|
||||||
This section concerns API calls related to datasets.
|
This section concerns API calls related to datasets.
|
||||||
@ -1610,6 +1733,42 @@ interface
|
|||||||
end interface
|
end interface
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Python templates for front end
|
||||||
|
|
||||||
|
#+begin_src python :tangle write_dset_data_front.py
|
||||||
|
def write_$group_dset$(trexio_file, dset_w) -> None:
|
||||||
|
try:
|
||||||
|
from pytrexio import trexio_write_$group_dset$, trexio_string_of_error, TREXIO_SUCCESS
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = trexio_write_$group_dset$(trexio_file, dset_w)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src python :tangle read_dset_data_front.py
|
||||||
|
def read_$group_dset$(trexio_file):
|
||||||
|
try:
|
||||||
|
from pytrexio import trexio_read_$group_dset$, trexio_string_of_error, TREXIO_SUCCESS
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc, dset_r = trexio_read_$group_dset$(trexio_file)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
return dset_r
|
||||||
|
#+end_src
|
||||||
** Sparse data structures
|
** Sparse data structures
|
||||||
|
|
||||||
Sparse data structures are used typically for large tensors such as
|
Sparse data structures are used typically for large tensors such as
|
||||||
@ -2065,6 +2224,56 @@ end interface
|
|||||||
end function trexio_write_$group_dset$
|
end function trexio_write_$group_dset$
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Python templates for front end
|
||||||
|
|
||||||
|
#+begin_src python :tangle write_dset_str_front.py
|
||||||
|
def write_$group_dset$(trexio_file, dset_w) -> None:
|
||||||
|
try:
|
||||||
|
from pytrexio import (trexio_write_$group_dset$,
|
||||||
|
trexio_string_of_error,
|
||||||
|
TREXIO_SUCCESS
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
max_str_length = len(max(dset_w, key=len)) + 1
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = trexio_write_$group_dset$(trexio_file, dset_w, max_str_length)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src python :tangle read_dset_str_front.py
|
||||||
|
def read_$group_dset$(trexio_file):
|
||||||
|
try:
|
||||||
|
from pytrexio import (trexio_read_$group_dset$,
|
||||||
|
trexio_string_of_error,
|
||||||
|
TREXIO_DELIM
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc, dset_1d_r = trexio_read_$group_dset$_low(trexio_file, PYTREXIO_MAX_STR_LENGTH)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
dset_2d_r = [item for item in dset_1d_r.split(TREXIO_DELIM) if item]
|
||||||
|
assert dset_2d_r
|
||||||
|
except AssertionError:
|
||||||
|
raise TypeError(f"Output of {read_$group_dset$.__name__} function cannot be an empty list.")
|
||||||
|
|
||||||
|
return dset_2d_r
|
||||||
|
#+end_src
|
||||||
** Templates for front end has/read/write a single string attribute
|
** Templates for front end has/read/write a single string attribute
|
||||||
*** Introduction
|
*** Introduction
|
||||||
|
|
||||||
@ -2243,6 +2452,50 @@ end interface
|
|||||||
end function trexio_write_$group_str$
|
end function trexio_write_$group_str$
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
*** Python templates for front end
|
||||||
|
|
||||||
|
#+begin_src python :tangle write_attr_str_front.py
|
||||||
|
def write_$group_str$(trexio_file, str_w) -> None:
|
||||||
|
try:
|
||||||
|
from pytrexio import (trexio_write_$group_str$,
|
||||||
|
trexio_string_of_error,
|
||||||
|
TREXIO_SUCCESS
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
max_str_length = len(str_w) + 1
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = trexio_write_$group_str$(trexio_file, str_w, max_str_length)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
#+begin_src python :tangle read_attr_str_front.py
|
||||||
|
def read_$group_str$(trexio_file):
|
||||||
|
try:
|
||||||
|
from pytrexio import (trexio_read_$group_str$,
|
||||||
|
trexio_string_of_error,
|
||||||
|
PYTREXIO_MAX_STR_LENGTH
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc, str_r = trexio_read_$group_str$(trexio_file, PYTREXIO_MAX_STR_LENGTH)
|
||||||
|
assert rc==TREXIO_SUCCESS
|
||||||
|
except AssertionError:
|
||||||
|
raise Exception(trexio_string_of_error(rc))
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
return str_r
|
||||||
|
#+end_src
|
||||||
* Fortran helper/wrapper functions
|
* Fortran helper/wrapper functions
|
||||||
|
|
||||||
The function below adapts the original C-based ~trexio_open~ for Fortran.
|
The function below adapts the original C-based ~trexio_open~ for Fortran.
|
||||||
|
Loading…
Reference in New Issue
Block a user