Skip to content

Commit 9aca656

Browse files
authored
add mini numbits
1 parent 3ac9b01 commit 9aca656

22 files changed

Lines changed: 2394 additions & 0 deletions

numbits/CMakeLists.txt

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
project(NumBits VERSION 1.0.0 LANGUAGES CXX)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
set(CMAKE_CXX_EXTENSIONS OFF)
7+
8+
# Build options
9+
option(NUMBITS_BUILD_TESTS "Build NumBits tests" ON)
10+
option(NUMBITS_BUILD_EXAMPLES "Build NumBits examples" ON)
11+
12+
# Include directories
13+
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
14+
15+
# Source files
16+
set(NUMBITS_SOURCES
17+
src/array.cpp
18+
src/operations.cpp
19+
src/math_functions.cpp
20+
src/linear_algebra.cpp
21+
src/broadcasting.cpp
22+
src/array_manipulation.cpp
23+
src/indexing.cpp
24+
)
25+
26+
set(NUMBITS_HEADERS
27+
include/numbits/array.hpp
28+
include/numbits/operations.hpp
29+
include/numbits/math_functions.hpp
30+
include/numbits/linear_algebra.hpp
31+
include/numbits/broadcasting.hpp
32+
include/numbits/array_manipulation.hpp
33+
include/numbits/indexing.hpp
34+
include/numbits/io.hpp
35+
include/numbits/types.hpp
36+
include/numbits/utils.hpp
37+
include/numbits/numbits.hpp
38+
)
39+
40+
# Create library
41+
add_library(numbits STATIC ${NUMBITS_SOURCES} ${NUMBITS_HEADERS})
42+
43+
target_include_directories(numbits PUBLIC
44+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
45+
$<INSTALL_INTERFACE:include>
46+
)
47+
48+
# Build examples
49+
if(NUMBITS_BUILD_EXAMPLES)
50+
add_subdirectory(examples)
51+
endif()
52+
53+
# Build tests
54+
if(NUMBITS_BUILD_TESTS)
55+
enable_testing()
56+
add_subdirectory(tests)
57+
endif()
58+
59+
# Installation
60+
install(TARGETS numbits
61+
EXPORT NumBitsTargets
62+
LIBRARY DESTINATION lib
63+
ARCHIVE DESTINATION lib
64+
RUNTIME DESTINATION bin
65+
)
66+
67+
install(DIRECTORY include/numbits
68+
DESTINATION include
69+
FILES_MATCHING PATTERN "*.hpp"
70+
)
71+
72+
install(EXPORT NumBitsTargets
73+
FILE NumBitsTargets.cmake
74+
NAMESPACE NumBits::
75+
DESTINATION lib/cmake/NumBits
76+
)
77+

numbits/examples/CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
3+
# Example 1: Basic array operations
4+
add_executable(example_basic example_basic.cpp)
5+
target_link_libraries(example_basic numbits)
6+
7+
# Example 2: Linear algebra
8+
add_executable(example_linear_algebra example_linear_algebra.cpp)
9+
target_link_libraries(example_linear_algebra numbits)
10+
11+
# Example 3: Math functions
12+
add_executable(example_math example_math.cpp)
13+
target_link_libraries(example_math numbits)
14+
15+
# Example 4: Broadcasting
16+
add_executable(example_broadcasting example_broadcasting.cpp)
17+
target_link_libraries(example_broadcasting numbits)

numbits/examples/example_basic.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <iostream>
2+
#include "numbits/ndarray.hpp"
3+
#include "numbits/operations.hpp"
4+
5+
using namespace numbits;
6+
7+
int main() {
8+
std::cout << "=== NumBits Basic Example ===\n\n";
9+
10+
// Create ndarrays
11+
ndarray<float> a({2, 3}, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f});
12+
ndarray<float> b({2, 3}, {7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
13+
14+
std::cout << "n-D array a:\n";
15+
a.print();
16+
std::cout << "\n\n";
17+
18+
std::cout << "n-D array b:\n";
19+
b.print();
20+
std::cout << "\n\n";
21+
22+
// Basic operations
23+
auto c = a + b;
24+
std::cout << "a + b:\n";
25+
c.print();
26+
std::cout << "\n\n";
27+
28+
auto d = a * 2.0f;
29+
std::cout << "a * 2:\n";
30+
d.print();
31+
std::cout << "\n\n";
32+
33+
// Scalar operations
34+
auto e = a + 10.0f;
35+
std::cout << "a + 10:\n";
36+
e.print();
37+
std::cout << "\n\n";
38+
39+
// Create zeros and ones
40+
auto zeros = ndarray<float>::zeros({3, 4});
41+
std::cout << "Zeros (3x4):\n";
42+
zeros.print();
43+
std::cout << "\n\n";
44+
45+
auto ones = ndarray<float>::ones({2, 2});
46+
std::cout << "Ones (2x2):\n";
47+
ones.print();
48+
std::cout << "\n\n";
49+
50+
// Reshape
51+
auto flattened = a.flatten();
52+
std::cout << "Flattened a:\n";
53+
flattened.print();
54+
std::cout << "\n\n";
55+
56+
auto reshaped = flattened.reshape({3, 2});
57+
std::cout << "Reshaped to (3x2):\n";
58+
reshaped.print();
59+
std::cout << "\n\n";
60+
61+
// Sum and mean
62+
std::cout << "Sum of a: " << sum(a) << "\n";
63+
std::cout << "Mean of a: " << mean(a) << "\n";
64+
std::cout << "Min of a: " << min(a) << "\n";
65+
std::cout << "Max of a: " << max(a) << "\n";
66+
67+
return 0;
68+
}
69+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <iostream>
2+
#include "numbits/ndarray.hpp"
3+
#include "numbits/operations.hpp"
4+
#include "numbits/broadcasting.hpp"
5+
6+
using namespace numbits;
7+
8+
int main() {
9+
std::cout << "=== NumBits Broadcasting Example ===\n\n";
10+
11+
// Create ndarrays of different shapes
12+
ndarray<float> a({2, 3}, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f});
13+
ndarray<float> b({3}, {10.0f, 20.0f, 30.0f});
14+
15+
std::cout << "n-D array a (2x3):\n";
16+
a.print();
17+
std::cout << "\n\n";
18+
19+
std::cout << "n-D array b (3):\n";
20+
b.print();
21+
std::cout << "\n\n";
22+
23+
// Broadcasting: a + b
24+
auto c = a + b;
25+
std::cout << "a + b (broadcasted):\n";
26+
c.print();
27+
std::cout << "\n\n";
28+
29+
// Scalar broadcasting
30+
ndarray<float> scalar_arr({1}, {5.0f});
31+
auto d = a + scalar_arr;
32+
std::cout << "a + scalar (5):\n";
33+
d.print();
34+
std::cout << "\n\n";
35+
36+
// Different broadcasting scenario
37+
ndarray<float> row({1, 4}, {1.0f, 2.0f, 3.0f, 4.0f});
38+
ndarray<float> col({4, 1}, {1.0f, 10.0f, 100.0f, 1000.0f});
39+
40+
std::cout << "Row vector (1x4):\n";
41+
row.print();
42+
std::cout << "\n\n";
43+
44+
std::cout << "Column vector (4x1):\n";
45+
col.print();
46+
std::cout << "\n\n";
47+
48+
auto broadcasted = row + col;
49+
std::cout << "Row + Column (broadcasted to 4x4):\n";
50+
broadcasted.print();
51+
std::cout << "\n\n";
52+
53+
// Element-wise multiplication with broadcasting
54+
ndarray<float> matrix({3, 3}, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f});
55+
ndarray<float> vec({3}, {2.0f, 3.0f, 4.0f});
56+
57+
std::cout << "Matrix (3x3):\n";
58+
matrix.print();
59+
std::cout << "\n\n";
60+
61+
std::cout << "Vector (3):\n";
62+
vec.print();
63+
std::cout << "\n\n";
64+
65+
auto multiplied = matrix * vec;
66+
std::cout << "Matrix * Vector (broadcasted):\n";
67+
multiplied.print();
68+
std::cout << "\n";
69+
70+
return 0;
71+
}
72+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <iostream>
2+
#include "numbits/ndarray.hpp"
3+
#include "numbits/linear_algebra.hpp"
4+
5+
using namespace numbits;
6+
7+
int main() {
8+
std::cout << "=== NumBits Linear Algebra Example ===\n\n";
9+
10+
// Create matrices
11+
ndarray<float> A({2, 3}, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f});
12+
ndarray<float> B({3, 2}, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f});
13+
14+
std::cout << "Matrix A (2x3):\n";
15+
A.print();
16+
std::cout << "\n\n";
17+
18+
std::cout << "Matrix B (3x2):\n";
19+
B.print();
20+
std::cout << "\n\n";
21+
22+
// Matrix multiplication
23+
auto C = matmul(A, B);
24+
std::cout << "A @ B (matrix multiplication):\n";
25+
C.print();
26+
std::cout << "\n\n";
27+
28+
// Transpose
29+
auto At = transpose(A);
30+
std::cout << "A transpose:\n";
31+
At.print();
32+
std::cout << "\n\n";
33+
34+
// Determinant
35+
ndarray<float> square({2, 2}, {1.0f, 2.0f, 3.0f, 4.0f});
36+
std::cout << "Square matrix:\n";
37+
square.print();
38+
std::cout << "\n";
39+
std::cout << "Determinant: " << determinant(square) << "\n\n";
40+
41+
// Inverse
42+
ndarray<float> invertible({2, 2}, {4.0f, 7.0f, 2.0f, 6.0f});
43+
std::cout << "Invertible matrix:\n";
44+
invertible.print();
45+
std::cout << "\n";
46+
47+
auto inv = inverse(invertible);
48+
std::cout << "Inverse:\n";
49+
inv.print();
50+
std::cout << "\n\n";
51+
52+
// Verify: A @ A^(-1) should be identity
53+
auto identity_check = matmul(invertible, inv);
54+
std::cout << "A @ A^(-1) (should be identity):\n";
55+
identity_check.print();
56+
std::cout << "\n\n";
57+
58+
// Trace
59+
ndarray<float> matrix({3, 3}, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f});
60+
std::cout << "Matrix:\n";
61+
matrix.print();
62+
std::cout << "\n";
63+
std::cout << "Trace: " << trace(matrix) << "\n";
64+
65+
return 0;
66+
}
67+

numbits/examples/example_math.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <iostream>
2+
#include <cmath>
3+
#include "numbits/ndarray.hpp"
4+
#include "numbits/math_functions.hpp"
5+
6+
using namespace numbits;
7+
8+
int main() {
9+
std::cout << "=== NumBits Math Functions Example ===\n\n";
10+
11+
// Create ndarray
12+
ndarray<float> arr({2, 3}, {0.0f, M_PI/4.0f, M_PI/2.0f, M_PI, 2.0f*M_PI, 1.0f});
13+
14+
std::cout << "Original n-D array:\n";
15+
arr.print();
16+
std::cout << "\n\n";
17+
18+
// Trigonometric functions
19+
auto sin_arr = sin(arr);
20+
std::cout << "sin(arr):\n";
21+
sin_arr.print();
22+
std::cout << "\n\n";
23+
24+
auto cos_arr = cos(arr);
25+
std::cout << "cos(arr):\n";
26+
cos_arr.print();
27+
std::cout << "\n\n";
28+
29+
// Exponential and logarithmic
30+
ndarray<float> exp_arr({1, 4}, {0.0f, 1.0f, 2.0f, -1.0f});
31+
std::cout << "n-D array for exp/log:\n";
32+
exp_arr.print();
33+
std::cout << "\n";
34+
35+
auto exp_result = exp(exp_arr);
36+
std::cout << "exp(arr):\n";
37+
exp_result.print();
38+
std::cout << "\n";
39+
40+
auto log_result = log(exp_result);
41+
std::cout << "log(exp(arr)) (should equal original):\n";
42+
log_result.print();
43+
std::cout << "\n\n";
44+
45+
// Power and sqrt
46+
ndarray<float> power_arr({2, 2}, {4.0f, 9.0f, 16.0f, 25.0f});
47+
std::cout << "n-D array:\n";
48+
power_arr.print();
49+
std::cout << "\n";
50+
51+
auto sqrt_result = sqrt(power_arr);
52+
std::cout << "sqrt(arr):\n";
53+
sqrt_result.print();
54+
std::cout << "\n";
55+
56+
auto pow_result = pow(power_arr, 0.5f);
57+
std::cout << "pow(arr, 0.5) (should equal sqrt):\n";
58+
pow_result.print();
59+
std::cout << "\n\n";
60+
61+
// Rounding functions
62+
ndarray<float> round_arr({1, 5}, {1.4f, 1.6f, -1.4f, -1.6f, 2.5f});
63+
std::cout << "n-D array:\n";
64+
round_arr.print();
65+
std::cout << "\n";
66+
67+
auto floor_result = floor(round_arr);
68+
std::cout << "floor(arr):\n";
69+
floor_result.print();
70+
std::cout << "\n";
71+
72+
auto ceil_result = ceil(round_arr);
73+
std::cout << "ceil(arr):\n";
74+
ceil_result.print();
75+
std::cout << "\n";
76+
77+
auto round_result = round(round_arr);
78+
std::cout << "round(arr):\n";
79+
round_result.print();
80+
std::cout << "\n";
81+
82+
return 0;
83+
}
84+

0 commit comments

Comments
 (0)