add some functions to convert input char to dimension and tensor

This commit is contained in:
2024-02-25 00:53:57 +01:00
parent ef107c11db
commit c1409546ef
18 changed files with 688 additions and 128 deletions
+55 -3
View File
@@ -143,7 +143,14 @@ void split_dim_part(dimension *root, dimension **part_1, dimension **part_2, siz
}
}
void increment_dim_var(dimension *d){
if(endian){
(d->perm[0])++;
}
else{
(d->perm[d->size - 1])++;
}
}
void add_dimension(dimension **d, dimension *d0, dimension *d1) {
(*d) = create_dim(d0->size + d1->size);
@@ -170,9 +177,11 @@ void min_dimension(dimension **d, dimension *d0, dimension *d1) {
void printDebug_dimension(dimension *d,char *msg){
printf("(%s)->size = %ld | (%s)->rank = %ld \n",msg,d->size,msg,d->rank);
printf("(%s)->size = %ld | (%s)->rank = %ld \n[",msg,d->size,msg,d->rank);
for(size_t i=0; i<d->size; ++i)
printf("[%ld: %ld] |", i,d->perm[i]);
printf(" %ld,", d->perm[i]);
printf("] \n");
//printf("[%ld: %ld] |", i,d->perm[i]);
/* if(endian)
printf("\nendian (true): the bigest index varies first, e.g: [x0,x1,x2,...,xn] xn is the bigest index\n");
else
@@ -287,3 +296,46 @@ size_t* CoordFromLin(size_t line, dimension *dim){
return ret;
}
void append_in_list_perm(list_perm_in_dim **list_p, size_t perm){
list_perm_in_dim *lis=malloc(sizeof(list_perm_in_dim));
lis->perm=perm;
lis->next=NULL;
if(*list_p == NULL){
lis->index=0;
*list_p = lis;
}
else{
list_perm_in_dim *tmp =*list_p;
while(tmp->next) tmp=tmp->next;
lis->index = tmp->index +1;
tmp->next=lis;
}
}
dimension * create_dim_from_list_perm( list_perm_in_dim *l_p){
if(l_p){
list_perm_in_dim *tmp =l_p;
while(tmp->next) tmp=tmp->next;
dimension *dim=create_dim(tmp->index + 1);
(dim)->size = tmp->index + 1;
tmp=l_p;
while(tmp){
(dim)->perm[tmp->index]=tmp->perm;
tmp=tmp->next;
}
updateRankDim(dim);
return dim;
}
return NULL;
}
void free_list_perm_in_dim(list_perm_in_dim *l_p){
list_perm_in_dim *tmp=l_p, *ttmp;
while(tmp){
ttmp = tmp;
tmp = ttmp->next;
free(ttmp);
}
}
+14
View File
@@ -47,6 +47,20 @@ size_t LineFromCoord(size_t *coo, dimension *dim);
size_t* CoordFromLin(size_t line, dimension *dim);
void vCoordFromLin(size_t *ret, size_t line, dimension *dim );
void increment_dim_var(dimension *d);
struct list_perm_in_dim{
size_t index;
size_t perm;
struct list_perm_in_dim *next;
};
typedef struct list_perm_in_dim list_perm_in_dim;
void append_in_list_perm(list_perm_in_dim **list_p, size_t perm);
dimension * create_dim_from_list_perm( list_perm_in_dim *l_p);
void free_list_perm_in_dim(list_perm_in_dim *l_p);
#endif /* __DIMENSION_T__H__ */
//int compare_dimension(dimension *d1, dimension *d2);
+38
View File
@@ -179,6 +179,44 @@ TEST(sprint_dim){
free(dimSTR);
}
TEST(incrment_dim){
endian=false;
dimension *D=create_dim(4);
D->perm[0]=2;
D->perm[1]=3;
D->perm[2]=5;
D->perm[3]=6;
updateRankDim(D);
char *dimSTR =NULL;
size_t nb=sprint_dimension(&dimSTR, D);
LOG(" nb char : %ld\n, dim print:\n%s\n",nb, dimSTR);
increment_dim_var(D);
nb=sprint_dimension(&dimSTR, D);
LOG(" nb char : %ld\n, dim print increment:\n%s\n",nb, dimSTR);
free_dimension(D);
free(dimSTR);
}
TEST(list_perm_in_dim){
list_perm_in_dim *l_p=NULL;
for(size_t i=1;i<5; ++i){
append_in_list_perm(&l_p, i);
}
dimension *dim=create_dim_from_list_perm(l_p);
printDebug_dimension(dim, "from l_p");
}
int main(int argc, char **argv){