Skip to content

Commit 6c87e03

Browse files
authored
Avoid using complex number literal extension. (#18)
* Avoid using complex number literal extension, instead relying on standard-defined memory layout. * Add matrix with complex numbers to CI. * Actually compile with Clang.
1 parent fbf3902 commit 6c87e03

File tree

4 files changed

+42
-12
lines changed

4 files changed

+42
-12
lines changed

.github/workflows/ci.yml

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,33 @@ jobs:
2626

2727
gcc:
2828
runs-on: 'ubuntu-latest'
29-
strategy:
30-
matrix:
31-
cxx: [gcc, clang]
32-
name: ${{ matrix.cxx }}
3329
env:
34-
CXX: ${{ matrix.cxx }}
30+
CXX: g++-12
31+
CC: gcc-12
3532
steps:
3633
- uses: actions/checkout@v4
3734
- name: CMake
3835
run: |
3936
sudo apt-get update
40-
sudo apt-get install libhdf5-dev g++-12
41-
CXX=g++-12 cmake -B build
37+
sudo apt-get install libhdf5-dev $CXX $CC
38+
cmake -B build
39+
- name: Build
40+
run: VERBOSE=true make -C build -j `nproc`
41+
- name: Test
42+
run: ctest --test-dir ./build/test/bash
43+
44+
clang:
45+
runs-on: 'ubuntu-latest'
46+
env:
47+
CXX: clang++
48+
CC: clang
49+
steps:
50+
- uses: actions/checkout@v4
51+
- name: CMake
52+
run: |
53+
sudo apt-get update
54+
sudo apt-get install libhdf5-dev clang
55+
cmake -B build
4256
- name: Build
4357
run: VERBOSE=true make -C build -j `nproc`
4458
- name: Test

include/binsparse/detail/declamp_values.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,12 @@ static inline void bsp_matrix_declamp_values(bsp_matrix_t matrix) {
4242
real_value = bsp_suitesparse_declamp_impl_(real_value);
4343
imaginary_value = bsp_suitesparse_declamp_impl_(imaginary_value);
4444

45-
values[i] = real_value + 1j * imaginary_value;
45+
double _Complex complex_value;
46+
47+
((double*) &complex_value)[0] = real_value;
48+
((double*) &complex_value)[1] = imaginary_value;
49+
50+
values[i] = complex_value;
4651
}
4752
}
4853
}

include/binsparse/matrix_market/matrix_market_read.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ static inline bsp_matrix_t bsp_mmread_explicit_array(const char* file_path,
8989
double real_value, imaginary_value;
9090
sscanf(buf, "%lf %lf", &real_value, &imaginary_value);
9191

92-
double _Complex value = real_value + 1j * imaginary_value;
92+
double _Complex value;
93+
94+
((double*) &value)[0] = real_value;
95+
((double*) &value)[1] = imaginary_value;
9396

9497
size_t i = count % matrix.ncols;
9598
size_t j = count / matrix.ncols;
@@ -203,12 +206,15 @@ bsp_mmread_explicit_coordinate(const char* file_path, bsp_type_t value_type,
203206
bsp_array_write(matrix.indices_1, count, j);
204207
} else if (mm_type == BSP_MM_COMPLEX) {
205208
unsigned long long i, j;
206-
double real_value, complex_value;
207-
sscanf(buf, "%llu %llu %lf %lf", &i, &j, &real_value, &complex_value);
209+
double real_value, imaginary_value;
210+
sscanf(buf, "%llu %llu %lf %lf", &i, &j, &real_value, &imaginary_value);
208211
i--;
209212
j--;
210213

211-
double _Complex value = real_value + 1j * complex_value;
214+
double _Complex value;
215+
216+
((double*) &value)[0] = real_value;
217+
((double*) &value)[1] = imaginary_value;
212218

213219
bsp_array_write(matrix.values, count, value);
214220
bsp_array_write(matrix.indices_0, count, i);

test/bash/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ download_data(https://suitesparse-collection-website.herokuapp.com/MM/Belcastro/
2222
download_data(https://suitesparse-collection-website.herokuapp.com/MM/Pajek/IMDB.tar.gz
2323
IMDB.tar.gz)
2424

25+
download_data(https://suitesparse-collection-website.herokuapp.com/MM/Bai/dwg961a.tar.gz
26+
dwg961a.tar.gz)
27+
2528
find_program(BASH_PROGRAM bash)
2629

2730
enable_testing()
@@ -31,9 +34,11 @@ if(BASH_PROGRAM)
3134
add_test(NAME integration.1138_bus COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test.sh ${CMAKE_BINARY_DIR}/data/1138_bus.tar.gz)
3235
add_test(NAME integration.mouse_gene COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test.sh ${CMAKE_BINARY_DIR}/data/mouse_gene.tar.gz)
3336
add_test(NAME integration.IMDB COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test.sh ${CMAKE_BINARY_DIR}/data/IMDB.tar.gz)
37+
add_test(NAME integration.dwg961a COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test.sh ${CMAKE_BINARY_DIR}/data/dwg961a.tar.gz)
3438

3539
add_test(NAME integration.cpp.chesapeake COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test-cpp.sh ${CMAKE_BINARY_DIR}/data/chesapeake.tar.gz)
3640
add_test(NAME integration.cpp.1138_bus COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test-cpp.sh ${CMAKE_BINARY_DIR}/data/1138_bus.tar.gz)
3741
add_test(NAME integration.cpp.mouse_gene COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test-cpp.sh ${CMAKE_BINARY_DIR}/data/mouse_gene.tar.gz)
3842
add_test(NAME integration.cpp.IMDB COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test-cpp.sh ${CMAKE_BINARY_DIR}/data/IMDB.tar.gz)
43+
add_test(NAME integration.cpp.dwg961a COMMAND ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/test-cpp.sh ${CMAKE_BINARY_DIR}/data/dwg961a.tar.gz)
3944
endif()

0 commit comments

Comments
 (0)