Skip to content

Commit cc6dcc5

Browse files
committed
forward pass
1 parent 2a86b80 commit cc6dcc5

22 files changed

Lines changed: 561 additions & 0 deletions

File tree

.clang-format

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# .clang-format for C project with Allman style braces
2+
BasedOnStyle: LLVM
3+
4+
# Indentation
5+
IndentWidth: 4
6+
UseTab: Never
7+
TabWidth: 4
8+
9+
# Line length
10+
ColumnLimit: 85
11+
BinPackParameters: true
12+
BinPackArguments: true
13+
14+
# Braces style
15+
BreakBeforeBraces: Allman # Allman style: brace on next line
16+
BraceWrapping:
17+
AfterFunction: true
18+
AfterControlStatement: true
19+
AfterStruct: true
20+
AfterClass: true
21+
AfterNamespace: false
22+
IndentBraces: false
23+
24+
# Pointers
25+
PointerAlignment: Right
26+
27+
# Spaces
28+
SpaceAfterCStyleCast: true
29+
SpaceAfterLogicalNot: false
30+
SpacesInParentheses: false
31+
SpacesInContainerLiterals: false
32+
SpaceBeforeParens: ControlStatements
33+
34+
# Allow single-line short statements if simple
35+
AllowShortIfStatementsOnASingleLine: true
36+
AllowShortLoopsOnASingleLine: true
37+
AllowShortFunctionsOnASingleLine: Inline
38+
AllowAllParametersOfDeclarationOnNextLine: true
39+
40+
41+
# Other
42+
ReflowComments: true
43+
IndentCaseLabels: true
44+
AlignOperands: true
45+
InsertNewlineAtEOF: true

CMakeLists.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
project(DNLP_Diff_Engine C)
3+
4+
set(CMAKE_C_STANDARD 99)
5+
6+
# Include directories
7+
include_directories(${PROJECT_SOURCE_DIR}/include)
8+
9+
# Source files
10+
set(SOURCES
11+
src/expr.c
12+
src/elementwise/exp.c
13+
src/elementwise/log.c
14+
src/affine/variable.c
15+
src/affine/constant.c
16+
src/affine/add.c
17+
)
18+
19+
# Create library
20+
add_library(dnlp_diff ${SOURCES})
21+
target_link_libraries(dnlp_diff m)
22+
23+
# Enable testing
24+
enable_testing()
25+
26+
# Single test executable that links all test source files
27+
add_executable(test_all
28+
tests/forward_pass/all_tests.c
29+
tests/forward_pass/test_helpers.c
30+
tests/forward_pass/affine/test_variable_constant.c
31+
tests/forward_pass/affine/test_add.c
32+
tests/forward_pass/elementwise/test_exp.c
33+
tests/forward_pass/elementwise/test_log.c
34+
tests/forward_pass/composite/test_composite.c
35+
)
36+
target_link_libraries(test_all dnlp_diff)
37+
add_test(NAME AllTests COMMAND test_all)

include/affine/add.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef ADD_H
2+
#define ADD_H
3+
4+
#include "expr.h"
5+
6+
expr *new_add(expr *left, expr *right);
7+
8+
#endif /* ADD_H */

include/affine/constant.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef CONSTANT_H
2+
#define CONSTANT_H
3+
4+
#include "expr.h"
5+
6+
expr *new_constant(int m, const double *values);
7+
8+
#endif /* CONSTANT_H */

include/affine/variable.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef VARIABLE_H
2+
#define VARIABLE_H
3+
4+
#include "expr.h"
5+
6+
expr *new_variable(int m);
7+
8+
#endif /* VARIABLE_H */

include/elementwise.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef ELEMENTWISE_H
2+
#define ELEMENTWISE_H
3+
4+
#include "expr.h"
5+
6+
expr *new_exp(expr *child);
7+
expr *new_log(expr *child);
8+
9+
#endif /* ELEMENTWISE_H */

include/expr.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#ifndef EXPR_H
2+
#define EXPR_H
3+
4+
#include <stddef.h>
5+
6+
/* Forward declaration */
7+
struct expr;
8+
9+
/* Function pointer type for forward pass computation */
10+
typedef void (*forward_fn)(struct expr *node, const double *u);
11+
12+
/* Expression node structure */
13+
typedef struct expr
14+
{
15+
int m; /* Output dimension */
16+
double *value; /* Preallocated output value array */
17+
struct expr *left; /* Left child (can be NULL) */
18+
struct expr *right; /* Right child (can be NULL) */
19+
forward_fn forward; /* Forward pass function */
20+
} expr;
21+
22+
/* Memory management functions */
23+
expr *new_expr(int m);
24+
void free_expr(expr *node);
25+
26+
#endif /* EXPR_H */

src/affine/add.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "affine/add.h"
2+
3+
static void add_forward(expr *node, const double *u)
4+
{
5+
/* children's forward passes */
6+
node->left->forward(node->left, u);
7+
node->right->forward(node->right, u);
8+
9+
/* add left and right values */
10+
for (int i = 0; i < node->m; i++)
11+
{
12+
node->value[i] = node->left->value[i] + node->right->value[i];
13+
}
14+
}
15+
16+
expr *new_add(expr *left, expr *right)
17+
{
18+
if (!left || !right) return NULL;
19+
if (left->m != right->m) return NULL; /* Dimension mismatch */
20+
21+
expr *node = new_expr(left->m);
22+
if (!node) return NULL;
23+
24+
node->left = left;
25+
node->right = right;
26+
node->forward = add_forward;
27+
28+
return node;
29+
}

src/affine/constant.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "affine/constant.h"
2+
#include <string.h>
3+
4+
static void constant_forward(expr *node, const double *u)
5+
{
6+
/* Constants don't depend on u; values are already set */
7+
(void) node;
8+
(void) u;
9+
}
10+
11+
expr *new_constant(int m, const double *values)
12+
{
13+
expr *node = new_expr(m);
14+
if (!node) return NULL;
15+
16+
/* Copy constant values */
17+
memcpy(node->value, values, m * sizeof(double));
18+
19+
node->forward = constant_forward;
20+
21+
return node;
22+
}

src/affine/variable.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include "affine/variable.h"
2+
#include <string.h>
3+
4+
static void variable_forward(expr *node, const double *u)
5+
{
6+
memcpy(node->value, u, node->m * sizeof(double));
7+
}
8+
9+
expr *new_variable(int m)
10+
{
11+
expr *node = new_expr(m);
12+
if (!node) return NULL;
13+
14+
node->forward = variable_forward;
15+
16+
return node;
17+
}

0 commit comments

Comments
 (0)