@@ -49,6 +49,10 @@ typedef struct EdgeTX
4949} EdgeTX ;
5050
5151// operations TODO TODO TODO !!!
52+ void owns_or_bool (EdgeOwns * z , const EdgeOwns * _x , const EdgeOwns * _y )
53+ {
54+ * z = * _x ;
55+ }
5256
5357void tx_add (EdgeTX * z , EdgeTX * x , EdgeTX * y )
5458{
@@ -381,17 +385,17 @@ int main()
381385 }
382386 GxB_print (v , GxB_COMPLETE );
383387 GrB_Matrix v_mat , id_mat ;
384- GrB_Matrix_new (& v_mat , GrB_BOOL ,VERTICES_NUMBER ,1 );
385- GrB_Col_assign (v_mat ,NULL ,NULL ,v , GrB_ALL ,VERTICES_NUMBER ,0 , NULL );
388+ GrB_Matrix_new (& v_mat , GrB_BOOL , VERTICES_NUMBER , 1 );
389+ GrB_Col_assign (v_mat , NULL , NULL , v , GrB_ALL , VERTICES_NUMBER , 0 , NULL );
386390
387391 GrB_Vector id ;
388392 info = GrB_Vector_new (& id , GrB_BOOL , VERTICES_NUMBER );
389393 info = GrB_Vector_assign_BOOL (id , NULL , NULL , true, GrB_ALL , VERTICES_NUMBER , NULL );
390- GrB_Matrix_new (& id_mat , GrB_BOOL ,1 , VERTICES_NUMBER );
391- GrB_Row_assign (id_mat ,NULL ,NULL ,id ,0 , GrB_ALL ,VERTICES_NUMBER ,NULL );
394+ GrB_Matrix_new (& id_mat , GrB_BOOL , 1 , VERTICES_NUMBER );
395+ GrB_Row_assign (id_mat , NULL , NULL , id , 0 , GrB_ALL , VERTICES_NUMBER , NULL );
392396
393397 GrB_Matrix kron ;
394- GrB_Matrix_new (& kron ,GrB_BOOL ,VERTICES_NUMBER ,VERTICES_NUMBER );
398+ GrB_Matrix_new (& kron , GrB_BOOL , VERTICES_NUMBER , VERTICES_NUMBER );
395399 GxB_print (v_mat , GxB_COMPLETE );
396400 GxB_print (id_mat , GxB_COMPLETE );
397401 info = GrB_kronecker (kron , NULL , NULL , GrB_LAND , v_mat , id_mat , NULL );
@@ -404,7 +408,7 @@ int main()
404408
405409 // DEBUG
406410 printf ("filter matrix content: \n" );
407- for (GrB_Index i = 0 ; i < VERTICES_NUMBER ; i ++ )
411+ for (GrB_Index i = 0 ; i < VERTICES_NUMBER ; i ++ )
408412 for (GrB_Index j = 0 ; j < VERTICES_NUMBER ; j ++ )
409413 {
410414 bool val ;
@@ -447,7 +451,7 @@ int main()
447451 // verices filter
448452 // фильтр только owns фильтруем с одной стороны (исходящие ребра) (поправить рисунок)
449453 GrB_Matrix owns_mat_filtered ;
450- GrB_Matrix_new (& owns_mat_filtered ,owns_edge ,VERTICES_NUMBER ,VERTICES_NUMBER );
454+ GrB_Matrix_new (& owns_mat_filtered , owns_edge , VERTICES_NUMBER , VERTICES_NUMBER );
451455 printf ("\nowns edge mat before filter\n" );
452456 for (GrB_Index i = 0 ; i < VERTICES_NUMBER ; i ++ )
453457 for (GrB_Index j = 0 ; j < VERTICES_NUMBER ; j ++ )
@@ -496,9 +500,52 @@ int main()
496500 // в итоге получаем ребра исходящие из отобранных пользователем
497501
498502 // /*--------------------------- PART 2 --------------------------*/
503+ GrB_Vector filtered_cards ;
504+ info = GrB_Vector_new (& filtered_cards , owns_edge , VERTICES_NUMBER );
505+ if (info != GrB_SUCCESS )
506+ {
507+ fprintf (stderr , "failed to create filtered cards vector %d\n" , info );
508+ return 1 ;
509+ }
510+
511+ GrB_BinaryOp ownsedge_bool ;
512+ info = GrB_BinaryOp_new (& ownsedge_bool , (GxB_binary_function )& owns_or_bool , owns_edge , owns_edge , owns_edge );
513+ if (info != GrB_SUCCESS )
514+ {
515+ fprintf (stderr , "failed to create binop ownsedge_bool %d\n" , info );
516+ return 1 ;
517+ }
518+ bool identity = false;
519+ GrB_Monoid ownsedge_any_bool ;
520+ info = GrB_Monoid_new (& ownsedge_any_bool , ownsedge_bool , (void * )& identity );
521+ if (info != GrB_SUCCESS )
522+ {
523+ fprintf (stderr , "failed to create monoid ownsedge_any_bool %d\n" , info );
524+ return 1 ;
525+ }
526+ GxB_print (owns_mat_filtered , GxB_COMPLETE );
527+ info = GrB_Matrix_reduce_Monoid (filtered_cards , NULL , NULL , ownsedge_any_bool , owns_mat_filtered , GrB_DESC_T0 );
528+ if (info != GrB_SUCCESS )
529+ {
530+ fprintf (stderr , "failed to filter cards %d\n" , info );
531+ return 1 ;
532+ }
533+ GxB_print (filtered_cards , GxB_COMPLETE );
499534
500- // теперь нужно взять карты (редукция по строчкам или по столбцам)
501- // редуцируем карты (строим вектор карты, которые относятся к отфильтрованным пользователем )
535+ GrB_Vector bool_vec ;
536+ info = GrB_Vector_new (& bool_vec , GrB_BOOL , VERTICES_NUMBER );
537+ if (info != GrB_SUCCESS )
538+ {
539+ fprintf (stderr , "failed to create id vector for filtered cards %d\n" , info );
540+ return 1 ;
541+ }
542+ info = GrB_assign (bool_vec , filtered_cards , NULL , true, GrB_ALL , VERTICES_NUMBER , GrB_DESC_S );
543+ if (info != GrB_SUCCESS )
544+ {
545+ fprintf (stderr , "failed to fill id vector for filtered cards %d\n" , info );
546+ return 1 ;
547+ }
548+ GxB_print (bool_vec , GxB_COMPLETE );
502549
503550 // строим ID матрицу
504551
0 commit comments