Files
ctensor/tensoriter.c

129 lines
3.1 KiB
C

#include "tensoriter.h"
tensoriter_scalar tensoriter_scalar_create(tensor t)
{
/* Creates an iterator over the values of a tensor.
*
* @param t The tensor to iterate over
*
* @return The iterator
*/
assert(!tensor_is_empty(t));
tensoriter_scalar it = malloc(sizeof(struct _tensor_scalar_iterator));
if (it == NULL) return NULL;
it->current = t->elements;
it->length = t->num_elem;
return it;
}
void tensoriter_scalar_destroy(tensoriter_scalar it)
{
/* Destroys an iterator.
*
* @param it The iterator to destroy
*/
free(it);
}
bool tensoriter_scalar_next(tensoriter_scalar it)
{
/* Checks whether the given iterator has a next value and sets this value
* as the current value if available. If there is not next value the
* iterator is destroyed and false is returned.
*
* @param it The iterator to evaluate
*
* @return true if there is a next value, false otherwise
*/
if (it->length == 1) {
tensoriter_scalar_destroy(it);
return false;
}
it->current++;
it->length--;
return true;
}
dtype *tensoriter_scalar_get(tensoriter_scalar it)
{
/* Gets the current value of the iterator.
*
* @param it The iterator to operate on
*
* @return A pointer to the current value
*/
return it->current;
}
void tensoriter_scalar_map(tensoriter_scalar it, dtype (*func)(dtype))
{
/* Replaces every value in an iterator with the result of given function
* with the old value as a parameter.
*
* @param it The iterator to operate on
* @param func The map function that is called
*/
do {
dtype *el = tensoriter_scalar_get(it);
*el = func(*el);
} while(tensoriter_scalar_next(it));
}
void tensoriter_scalar_map_add(tensoriter_scalar it, dtype scalar)
{
/* Adds a fixed scalar value to all the values of the iterator.
*
* @param it The iterator to operate on
* @param scalar The value to add
*/
do {
dtype* x = tensoriter_scalar_get(it);
*x = DTYPE_ADD(*x, scalar);
} while(tensoriter_scalar_next(it));
}
void tensoriter_scalar_map_sub(tensoriter_scalar it, dtype scalar)
{
/* Subtracts a fixed scalar value from all the values of the iterator.
*
* @param it The iterator to operate on
* @param scalar The value to subtract
*/
do {
dtype* x = tensoriter_scalar_get(it);
*x = DTYPE_SUB(*x, scalar);
} while(tensoriter_scalar_next(it));
}
void tensoriter_scalar_map_mul(tensoriter_scalar it, dtype scalar)
{
/* Multiplies a fixed scalar value with all the values of the iterator.
*
* @param it The iterator to operate on
* @param scalar The value to multiply
*/
do {
dtype* x = tensoriter_scalar_get(it);
*x = DTYPE_MUL(*x, scalar);
} while(tensoriter_scalar_next(it));
}
void tensoriter_scalar_map_div(tensoriter_scalar it, dtype scalar)
{
/* Divides all the values of the iterator by a fixed scalar value.
*
* @param it The iterator to operate on
* @param scalar The value to divide by
*/
do {
dtype* x = tensoriter_scalar_get(it);
*x = DTYPE_DIV(*x, scalar);
} while(tensoriter_scalar_next(it));
}