2021-07-19 17:59:26 +02:00
import os
import shutil
2021-08-06 13:04:29 +02:00
import numpy as np
2021-07-19 17:59:26 +02:00
from pytrexio import *
2021-08-06 13:04:29 +02:00
# TODO:
# 1) make a user-friendly more pythonic API that will have to be autogenerated
# 2) add Exception handling (can be done easily in the front end python-ic API e.g. try: if function_call(...) == TREXIO_SUCCESS
2021-08-04 13:13:23 +02:00
# automatically download (hopefully the latest version) numpy.i using
# wget https://raw.githubusercontent.com/numpy/numpy/main/tools/swig/numpy.i
# but also keep the original copy in case if wget fails
2021-07-19 17:59:26 +02:00
#=========================================================#
#======== SETUP THE BACK END AND OUTPUT FILE NAME ========#
#=========================================================#
# 0: TREXIO_HDF5 ; 1: TREXIO_TEXT
2021-07-26 19:27:45 +02:00
TEST_TREXIO_BACKEND = TREXIO_TEXT
2021-07-19 17:59:26 +02:00
OUTPUT_FILENAME_TEXT = ' test_py_swig.dir '
OUTPUT_FILENAME_HDF5 = ' test_py_swig.h5 '
2021-07-26 19:27:45 +02:00
if TEST_TREXIO_BACKEND == TREXIO_HDF5 :
2021-07-19 17:59:26 +02:00
output_filename = OUTPUT_FILENAME_HDF5
2021-07-26 19:27:45 +02:00
elif TEST_TREXIO_BACKEND == TREXIO_TEXT :
2021-07-19 17:59:26 +02:00
output_filename = OUTPUT_FILENAME_TEXT
else :
2021-07-26 19:27:45 +02:00
raise ValueError ( ' Specify one of the supported back ends as TEST_TREXIO_BACKEND ' )
2021-07-19 17:59:26 +02:00
try :
2021-07-26 19:27:45 +02:00
if TEST_TREXIO_BACKEND == TREXIO_HDF5 :
2021-07-19 17:59:26 +02:00
os . remove ( output_filename )
2021-07-26 19:27:45 +02:00
elif TEST_TREXIO_BACKEND == TREXIO_TEXT :
2021-07-19 17:59:26 +02:00
shutil . rmtree ( output_filename )
except :
2021-08-06 13:04:29 +02:00
print ( ' Nothing to remove. ' )
2021-07-19 17:59:26 +02:00
#=========================================================#
#============ WRITE THE DATA IN THE TEST FILE ============#
#=========================================================#
test_file = trexio_open ( output_filename , ' w ' , TEST_TREXIO_BACKEND )
nucleus_num = 12
rc = trexio_write_nucleus_num ( test_file , nucleus_num )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
2021-08-06 13:04:29 +02:00
# initialize charge arrays as a list and convert it to numpy array
charges = [ 6. , 6. , 6. , 6. , 6. , 6. , 1. , 1. , 1. , 1. , 1. , 1. ]
charges_np = np . array ( charges , dtype = np . float64 )
2021-07-19 17:59:26 +02:00
2021-08-06 13:04:29 +02:00
# function call below works with both lists and numpy arrays, dimension needed for memory-safety is derived
# from the size of the list/array by SWIG using typemacs from numpy.i
rc = trexio_write_safe_nucleus_charge ( test_file , charges_np )
assert rc == TREXIO_SUCCESS
# less Python-ic way to read/write arrays using Array classes (probably more portable to other languages)
#charges = doubleArray(nucleus_num)
#for i in range(nucleus_num):
# if i < nucleus_num/2:
# charges[i] = 6.
# else:
# charges[i] = 1.
#rc = trexio_write_nucleus_charge(test_file, charges)
# initialize arrays of nuclear indices as a list and convert it to numpy array
indices = [ i for i in range ( nucleus_num ) ]
# type cast is important here because by default numpy transforms a list of integers into int64 array
indices_np = np . array ( indices , dtype = np . int32 )
# function call below works with both lists and numpy arrays, dimension needed for memory-safety is derived
# from the size of the list/array by SWIG using typemacs from numpy.i
rc = trexio_write_safe_basis_nucleus_index ( test_file , indices_np )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
point_group = ' B3U '
rc = trexio_write_nucleus_point_group ( test_file , point_group , 10 )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
labels = [
' C ' ,
' C ' ,
' C ' ,
' C ' ,
' C ' ,
' C ' ,
' H ' ,
' H ' ,
' H ' ,
' H ' ,
' H ' ,
' H ' ]
rc = trexio_write_nucleus_label ( test_file , labels , 10 )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
rc = trexio_close ( test_file )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
#==========================================================#
#============ READ THE DATA FROM THE TEST FILE ============#
#==========================================================#
test_file2 = trexio_open ( output_filename , ' r ' , TEST_TREXIO_BACKEND )
2021-08-04 13:13:23 +02:00
# TODO: think about adding exception handling if rc != TREXIO_SUCCESS throw an exception but do not return the code itself and then there is less arguments
# TODO: maybe also for the write
2021-07-19 17:59:26 +02:00
result = trexio_read_nucleus_num ( test_file2 )
2021-08-04 13:13:23 +02:00
assert result [ 0 ] == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
assert result [ 1 ] == nucleus_num
2021-08-06 13:04:29 +02:00
# safe call to read_safe array of float values
rc , rcharges_np = trexio_read_safe_nucleus_charge ( test_file2 , nucleus_num )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-08-06 13:04:29 +02:00
assert rcharges_np . dtype is np . dtype ( np . float64 )
np . testing . assert_array_almost_equal ( rcharges_np , charges_np , decimal = 8 )
2021-07-19 17:59:26 +02:00
2021-08-06 13:04:29 +02:00
# unsafe call to read_safe should not only have return code = TREXIO_UNSAFE_ARRAY_DIM
# TODO: it should not return numpy array filled with garbage
rc , rcharges_fail = trexio_read_safe_nucleus_charge ( test_file2 , nucleus_num * 5 )
assert rc == TREXIO_UNSAFE_ARRAY_DIM
2021-07-28 15:59:29 +02:00
2021-08-06 13:04:29 +02:00
# less Python-ic way to read/write arrays using Array classes (probably more portable to other languages)
#charges2 = doubleArray(nucleus_num)
#for i in range(nucleus_num):
# charges2[i] = -1.
#rc = trexio_read_nucleus_charge(test_file2, charges2)
#assert rc==TREXIO_SUCCESS
#for i in range(nucleus_num):
# assert charges2[i]==charges[i]
2021-07-28 15:59:29 +02:00
2021-08-06 13:04:29 +02:00
# safe call to read_safe array of int values
rc , rindices_np = trexio_read_safe_basis_nucleus_index ( test_file2 , nucleus_num )
2021-07-28 15:59:29 +02:00
assert rc == TREXIO_SUCCESS
2021-08-06 13:04:29 +02:00
assert rindices_np . dtype is np . dtype ( np . int32 )
for i in range ( nucleus_num ) :
assert rindices_np [ i ] == indices_np [ i ]
2021-07-28 15:59:29 +02:00
2021-07-26 18:49:26 +02:00
# [WIP]: ideally, the list of strings should be returned as below
#rc, label_2d = trexio_read_nucleus_label(test_file2, 10)
# [WIP]: currently only low-level routines (return one long string instead of an array of strings) work
rc , labels_1d = trexio_read_nucleus_label_low ( test_file2 , 10 )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-26 18:49:26 +02:00
2021-07-26 19:27:45 +02:00
labels_2d = [ label for label in labels_1d . split ( TREXIO_DELIM ) if label ]
2021-08-06 13:04:29 +02:00
print ( ' Read and parsed nuclear labels: \n ' , labels_2d )
2021-07-19 17:59:26 +02:00
for i in range ( nucleus_num ) :
2021-07-26 18:49:26 +02:00
assert labels_2d [ i ] == labels [ i ]
2021-07-19 17:59:26 +02:00
rc = trexio_close ( test_file2 )
2021-07-26 19:27:45 +02:00
assert rc == TREXIO_SUCCESS
2021-07-19 17:59:26 +02:00
2021-07-28 15:59:29 +02:00
try :
if TEST_TREXIO_BACKEND == TREXIO_HDF5 :
os . remove ( output_filename )
elif TEST_TREXIO_BACKEND == TREXIO_TEXT :
shutil . rmtree ( output_filename )
except :
print ( f ' No output file { output_filename } has been produced ' )
2021-07-19 17:59:26 +02:00
#==========================================================#