@@ -447,9 +447,6 @@ int main()
447447 // ------------------------------------------------------------------------
448448 // apply user filters
449449 // ------------------------------------------------------------------------
450-
451- // verices filter
452- // фильтр только owns фильтруем с одной стороны (исходящие ребра) (поправить рисунок)
453450 GrB_Matrix owns_mat_filtered ;
454451 GrB_Matrix_new (& owns_mat_filtered , owns_edge , VERTICES_NUMBER , VERTICES_NUMBER );
455452 printf ("\nowns edge mat before filter\n" );
@@ -497,9 +494,13 @@ int main()
497494 // printf("[%lu,%lu] error code: %d\n", i, j, info);
498495 // }
499496 }
500- // в итоге получаем ребра исходящие из отобранных пользователем
501497
502498 // /*--------------------------- PART 2 --------------------------*/
499+
500+ // ------------------------------------------------------------------------
501+ // get cards of filtered users
502+ // ------------------------------------------------------------------------
503+
503504 GrB_Vector filtered_cards ;
504505 info = GrB_Vector_new (& filtered_cards , owns_edge , VERTICES_NUMBER );
505506 if (info != GrB_SUCCESS )
@@ -532,6 +533,10 @@ int main()
532533 }
533534 GxB_print (filtered_cards , GxB_COMPLETE );
534535
536+ // ------------------------------------------------------------------------
537+ // build filter for tx matrix
538+ // ------------------------------------------------------------------------
539+
535540 GrB_Vector bool_vec ;
536541 info = GrB_Vector_new (& bool_vec , GrB_BOOL , VERTICES_NUMBER );
537542 if (info != GrB_SUCCESS )
@@ -545,13 +550,130 @@ int main()
545550 fprintf (stderr , "failed to fill id vector for filtered cards %d\n" , info );
546551 return 1 ;
547552 }
548- GxB_print (bool_vec , GxB_COMPLETE );
553+ // GxB_print(bool_vec, GxB_COMPLETE);
554+
555+ GrB_Matrix v_mat2 , id_mat2 ;
556+ info = GrB_Matrix_new (& v_mat2 , GrB_BOOL , VERTICES_NUMBER , 1 );
557+ if (info != GrB_SUCCESS )
558+ {
559+ fprintf (stderr , "failed to create v_mat2 matrix %d\n" , info );
560+ return 1 ;
561+ }
562+ info = GrB_Col_assign (v_mat2 , NULL , NULL , bool_vec , GrB_ALL , VERTICES_NUMBER , 0 , NULL );
563+ if (info != GrB_SUCCESS )
564+ {
565+ fprintf (stderr , "failed to assign col to v_mat2 %d\n" , info );
566+ return 1 ;
567+ }
568+
569+ GrB_Vector id2 ;
570+ info = GrB_Vector_new (& id2 , GrB_BOOL , VERTICES_NUMBER );
571+ if (info != GrB_SUCCESS )
572+ {
573+ fprintf (stderr , "failed to create id2 vector %d\n" , info );
574+ return 1 ;
575+ }
576+ info = GrB_Vector_assign_BOOL (id2 , NULL , NULL , true, GrB_ALL , VERTICES_NUMBER , NULL );
577+ if (info != GrB_SUCCESS )
578+ {
579+ fprintf (stderr , "failed to assign bools to id2 mat %d\n" , info );
580+ return 1 ;
581+ }
582+ info = GrB_Matrix_new (& id_mat2 , GrB_BOOL , 1 , VERTICES_NUMBER );
583+ if (info != GrB_SUCCESS )
584+ {
585+ fprintf (stderr , "failed to create id_mat2 %d\n" , info );
586+ return 1 ;
587+ }
588+ info = GrB_Row_assign (id_mat2 , NULL , NULL , id2 , 0 , GrB_ALL , VERTICES_NUMBER , NULL );
589+ if (info != GrB_SUCCESS )
590+ {
591+ fprintf (stderr , "failed to assign row to id_mat2 %d\n" , info );
592+ return 1 ;
593+ }
594+
595+ GrB_Matrix kron2 , kronT ;
596+ info = GrB_Matrix_new (& kron2 , GrB_BOOL , VERTICES_NUMBER , VERTICES_NUMBER );
597+ if (info != GrB_SUCCESS )
598+ {
599+ fprintf (stderr , "failed to create kron2 %d\n" , info );
600+ return 1 ;
601+ }
602+ info = GrB_Matrix_new (& kronT , GrB_BOOL , VERTICES_NUMBER , VERTICES_NUMBER );
603+ if (info != GrB_SUCCESS )
604+ {
605+ fprintf (stderr , "failed to create kronT %d\n" , info );
606+ return 1 ;
607+ }
608+ // GxB_print(v_mat2, GxB_COMPLETE);
609+ // GxB_print(id_mat2, GxB_COMPLETE);
610+
611+ info = GrB_kronecker (kron2 , NULL , NULL , GrB_LAND , v_mat2 , id_mat2 , NULL );
612+ if (info != GrB_SUCCESS )
613+ {
614+ fprintf (stderr , "failed to do kronecker product for kron2 %d\n" , info );
615+ return 1 ;
616+ }
617+
618+ GrB_Matrix id_matT ;
619+ info = GrB_Matrix_new (& id_matT , GrB_BOOL , VERTICES_NUMBER , 1 );
620+ if (info != GrB_SUCCESS )
621+ {
622+ fprintf (stderr , "failed to create id_matT %d\n" , info );
623+ return 1 ;
624+ }
625+ info = GrB_Col_assign (id_matT , NULL , NULL , id2 , GrB_ALL , VERTICES_NUMBER , 0 , NULL );
626+ if (info != GrB_SUCCESS )
627+ {
628+ fprintf (stderr , "failed to assign col in id_matT %d\n" , info );
629+ return 1 ;
630+ }
631+
632+ GrB_Matrix v_matT ;
633+ info = GrB_Matrix_new (& v_matT , GrB_BOOL , 1 , VERTICES_NUMBER );
634+ if (info != GrB_SUCCESS )
635+ {
636+ fprintf (stderr , "failed to create v_matT %d\n" , info );
637+ return 1 ;
638+ }
639+ info = GrB_Row_assign (v_matT , NULL , NULL , bool_vec , 0 , GrB_ALL , VERTICES_NUMBER , NULL );
640+ if (info != GrB_SUCCESS )
641+ {
642+ fprintf (stderr , "failed to assign row to v_matT %d\n" , info );
643+ return 1 ;
644+ }
645+
646+ info = GrB_kronecker (kronT , NULL , NULL , GrB_LAND , id_matT , v_matT , NULL );
647+ if (info != GrB_SUCCESS )
648+ {
649+ fprintf (stderr , "failed to do kronecker product for kronT %d\n" , info );
650+ return 1 ;
651+ }
549652
550- // строим ID матрицу
653+ // GxB_print(kron2, GxB_COMPLETE);
654+ // GxB_print(kronT, GxB_COMPLETE);
551655
552- // ID с двух сторон на матрицу транзакций
553- // получили подграф на нужных транзакциях
656+ // ------------------------------------------------------------------------
657+ // apply cards filter to tx matrix
658+ // ------------------------------------------------------------------------
659+ GrB_Matrix tx_mat_filtered ;
660+ GrB_Matrix_new (& tx_mat_filtered , tx_edge , VERTICES_NUMBER , VERTICES_NUMBER );
661+ info = GrB_Matrix_assign (tx_mat_filtered , kron2 , NULL , tx_edge_mat , GrB_ALL , VERTICES_NUMBER , GrB_ALL , VERTICES_NUMBER , NULL );
662+ if (info != GrB_SUCCESS )
663+ {
664+ fprintf (stderr , "failed to assign kron2 to tx_edge_mat %d\n" , info );
665+ return 1 ;
666+ }
667+
668+ info = GrB_Matrix_assign (tx_mat_filtered , kronT , NULL , tx_edge_mat , GrB_ALL , VERTICES_NUMBER , GrB_ALL , VERTICES_NUMBER , NULL );
669+ if (info != GrB_SUCCESS )
670+ {
671+ fprintf (stderr , "failed to assign kronT to tx_edge_mat %d\n" , info );
672+ return 1 ;
673+ }
674+ GxB_print (tx_mat_filtered , GxB_COMPLETE );
554675
676+
555677 // теперь строим матрицу для pagerank (пункт ниже). softmax. (посмотреть как можно сделать не по дебильному с помощью GB)
556678 /// снова редуцируем по строчкам , получаем знаменатель softmax
557679 /// 2
0 commit comments