Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • features
  • increment
  • main
3 results

Target

Select target project
  • boris.stefanov/prog_kmeans
1 result
Select Git revision
  • features
  • increment
  • main
3 results
Show changes
Commits on Source (3)
......@@ -7,7 +7,7 @@ HDR := $(wildcard ${SRC_DIR}/*.h)
BUILD_DIR := ${BUILD_ROOT}/prod
TARGET := ${BUILD_DIR}/main
CFLAGS := -std=c11 -Wall -Wextra -pedantic
LDEXTRA :=
LDEXTRA := -lm
LDFLAGS := ${CFLAGS} ${LDEXTRA}
OBJ := $(patsubst ${SRC_DIR}/%.c,${BUILD_DIR}/%.o,${SRC})
......@@ -27,13 +27,13 @@ all: ${TARGET} ${TARGET_DEBUG}
${TARGET}: ${OBJ}
${CC} ${LDFLAGS} -o $@ $^
${OBJ}: ${BUILD_DIR}/%.o: %.c ${HDR} ${BUILD_DIR}
${OBJ}: ${BUILD_DIR}/%.o: ${SRC_DIR}/%.c ${HDR} ${BUILD_DIR}
${CC} ${CFLAGS} -c -o $@ $<
${DEBUG_TARGET}: ${DEBUG_OBJ}
${CC} ${DEBUG_LDFLAGS} -o $@ $^
${DEBUG_OBJ}: ${DEBUG_BUILD_DIR}/%.o: %.c ${HDR} ${DEBUG_BUILD_DIR}
${DEBUG_OBJ}: ${DEBUG_BUILD_DIR}/%.o: ${SRC_DIR}/%.c ${HDR} ${DEBUG_BUILD_DIR}
${CC} ${DEBUG_CFLAGS} -c -o $@ $<
......
//
// by Boris Stefanovic on 24/05/22
//
#ifndef PROG_KMEANS_COMMON_H
#define PROG_KMEANS_COMMON_H
#include <stdint.h>
typedef int64_t int_t;
typedef double fp_t;
#endif //PROG_KMEANS_COMMON_H
//
// by Boris Stefanovic on 24/05/22
//
#include "distance.h"
#include <math.h>
#include "common.h"
#define ERROR -1.0
double distance_euclid_int(const vector_int_t* p1, const vector_int_t* p2) {
if (p1->dim != p2->dim)return ERROR;
int_t acc = 0;
for (size_t i = 0; i < p1->dim; ++i) {
int_t diff = p2->data[i] - p1->data[i];
int_t item = diff * diff;
acc += item;
}
return sqrt((double) acc);
}
int_t abs_diff(const int_t a1, const int_t a2) {
int_t diff = a2 - a1;
return diff >= 0 ? diff : -diff;
}
double distance_manhattan_int(const vector_int_t* p1, const vector_int_t* p2) {
if (p1->dim != p2->dim)return ERROR;
int_t acc = 0;
for (size_t i = 0; i < p1->dim; ++i) {
int_t diff = p2->data[i] - p1->data[i];
int_t item = diff >= 0 ? diff : -diff;
acc += item;
}
return (double) acc;
}
double distance_chebyshev_int(const vector_int_t* p1, const vector_int_t* p2) {
if (p1->dim != p2->dim)return ERROR;
int_t max = ERROR;
int_t item;
for (size_t i = 0; i < p1->dim; ++i) {
item = abs_diff(p1->data[i], p2->data[i]);
if (item > max) max = item;
}
return (double) max;
}
//
// by Boris Stefanovic on 24/05/22
//
#ifndef PROG_KMEANS_DISTANCE_H
#define PROG_KMEANS_DISTANCE_H
#include "vector.h"
/*
* Although many distance return types may be left as integers,
* when passing function pointers to the k-means routine,
* a fixed signature will be expected.
* Therefore, we convert all distance return types to double.
*/
double distance_euclid_int(const vector_int_t* p1, const vector_int_t* p2);
double distance_manhattan_int(const vector_int_t* p1, const vector_int_t* p2);
double distance_chebyshev_int(const vector_int_t* p1, const vector_int_t* p2);
#endif //PROG_KMEANS_DISTANCE_H
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int main(int argc, char** argv) {
fprintf(stderr, "USAGE: %s <INPUT_FILE> <OUTPUT_FILE>\n", argv[0]);
char* ipath = "/dev/stdin";
char* opath = "/dev/stdout";
if (argc > 1) ipath = argv[1];
if (argc > 2) opath = argv[2];
// TODO
return EXIT_SUCCESS;
}
//
// Created by Boris Stefanovic on 24/05/22.
//
#include "vector.h"
#include <stdlib.h>
vector_int_t* vector_int_create(const size_t dim, const int_t* data) {
vector_int_t* v;
if ((v = malloc(dim * sizeof(int))) == NULL) return NULL;
v->dim = dim;
for (size_t i = 0; i < dim; ++i) v->data[i] = data[i];
return v;
}
//
// Created by Boris Stefanovic on 24/05/22.
//
#ifndef PROG_KMEANS_VECTOR_H
#define PROG_KMEANS_VECTOR_H
/*
* We can justify the implementation of vectors for multiple types to ease
* application to several scenarios without the need for casting,
* e.g. scientific measurements (floating point) and image data (integer).
*/
#include <stdlib.h>
#include "common.h"
typedef struct vector_int_t_ {
size_t dim;
int_t* data;
} vector_int_t;
vector_int_t* vector_int_create(const size_t dim, const int_t* data);
#endif //PROG_KMEANS_VECTOR_H