@@ -416,3 +416,183 @@ def test_size(context):
416
416
for size in range (1 , 10 ):
417
417
vec = ts .bfv_vector (context , [1 ] * size )
418
418
assert vec .size () == size , "Size of encrypted vector is incorrect."
419
+
420
+
421
+ @pytest .mark .parametrize (
422
+ "vec1, vec2" ,
423
+ [
424
+ ([0 ], [0 ]),
425
+ ([1 ], [0 ]),
426
+ ([- 1 ], [0 ]),
427
+ ([- 1 ], [- 1 ]),
428
+ ([1 ], [1 ]),
429
+ ([- 1 ], [1 ]),
430
+ ([- 1 , - 2 ], [- 73 , - 10 ]),
431
+ ([1 , 2 ], [- 73 , - 10 ]),
432
+ ([1 , 2 , 3 ], [4 , 3 , 2 ]),
433
+ ([1 , 2 , 3 , 4 ], [4 , 3 , 2 , 1 ]),
434
+ ([1 , 2 , 3 , 4 , 5 ], [5 , 4 , 3 , 2 , 1 ]),
435
+ ([1 , 2 , 3 , 4 , 5 , 6 ], [6 , 5 , 4 , 3 , 2 , 1 ]),
436
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 ], [7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
437
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ], [8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
438
+ ],
439
+ )
440
+ def test_dot_product (context , vec1 , vec2 ):
441
+ context .generate_galois_keys ()
442
+ first_vec = ts .bfv_vector (context , vec1 )
443
+ second_vec = ts .bfv_vector (context , vec2 )
444
+
445
+ result = first_vec .dot (second_vec )
446
+
447
+ expected = [sum ([v1 * v2 for v1 , v2 in zip (vec1 , vec2 )])]
448
+
449
+ # Decryption
450
+ assert result .decrypt () == expected , "Multiplication of vectors is incorrect."
451
+ assert first_vec .decrypt () == vec1 , "Something went wrong in memory."
452
+ assert second_vec .decrypt () == vec2 , "Something went wrong in memory."
453
+
454
+
455
+ @pytest .mark .parametrize (
456
+ "vec1, vec2" ,
457
+ [
458
+ ([0 ], [0 ]),
459
+ ([1 ], [0 ]),
460
+ ([- 1 ], [0 ]),
461
+ ([- 1 ], [- 1 ]),
462
+ ([1 ], [1 ]),
463
+ ([- 1 ], [1 ]),
464
+ ([- 1 , - 2 ], [- 73 , - 10 ]),
465
+ ([1 , 2 ], [- 73 , - 10 ]),
466
+ ([1 , 2 , 3 ], [4 , 3 , 2 ]),
467
+ ([1 , 2 , 3 , 4 ], [4 , 3 , 2 , 1 ]),
468
+ ([1 , 2 , 3 , 4 , 5 ], [5 , 4 , 3 , 2 , 1 ]),
469
+ ([1 , 2 , 3 , 4 , 5 , 6 ], [6 , 5 , 4 , 3 , 2 , 1 ]),
470
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 ], [7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
471
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ], [8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
472
+ ],
473
+ )
474
+ def test_dot_product_inplace (context , vec1 , vec2 ):
475
+ context .generate_galois_keys ()
476
+ first_vec = ts .bfv_vector (context , vec1 )
477
+ second_vec = ts .bfv_vector (context , vec2 )
478
+ first_vec .dot_ (second_vec )
479
+ expected = [sum ([v1 * v2 for v1 , v2 in zip (vec1 , vec2 )])]
480
+
481
+ # Decryption
482
+ assert first_vec .decrypt () == expected , "Dot product of vectors is incorrect."
483
+ assert second_vec .decrypt () == vec2 , "Something went wrong in memory."
484
+
485
+
486
+ @pytest .mark .parametrize (
487
+ "vec1, vec2" ,
488
+ [
489
+ ([0 ], [0 ]),
490
+ ([1 ], [0 ]),
491
+ ([- 1 ], [0 ]),
492
+ ([- 1 ], [- 1 ]),
493
+ ([1 ], [1 ]),
494
+ ([- 1 ], [1 ]),
495
+ ([- 1 , - 2 ], [- 73 , - 10 ]),
496
+ ([1 , 2 ], [- 73 , - 10 ]),
497
+ ([1 , 2 , 3 ], [4 , 3 , 2 ]),
498
+ ([1 , 2 , 3 , 4 ], [4 , 3 , 2 , 1 ]),
499
+ ([1 , 2 , 3 , 4 , 5 ], [5 , 4 , 3 , 2 , 1 ]),
500
+ ([1 , 2 , 3 , 4 , 5 , 6 ], [6 , 5 , 4 , 3 , 2 , 1 ]),
501
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 ], [7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
502
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ], [8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
503
+ ],
504
+ )
505
+ def test_dot_product_plain (context , vec1 , vec2 ):
506
+ context .generate_galois_keys ()
507
+ first_vec = ts .bfv_vector (context , vec1 )
508
+ second_vec = ts .plain_tensor (vec2 , dtype = "int" )
509
+ result = first_vec .dot (second_vec )
510
+ expected = [sum ([v1 * v2 for v1 , v2 in zip (vec1 , vec2 )])]
511
+
512
+ # Decryption
513
+ assert result .decrypt () == expected , "Dot product of vectors is incorrect."
514
+ assert first_vec .decrypt () == vec1 , "Something went wrong in memory."
515
+
516
+
517
+ @pytest .mark .parametrize (
518
+ "vec1, vec2" ,
519
+ [
520
+ ([0 ], [0 ]),
521
+ ([1 ], [0 ]),
522
+ ([- 1 ], [0 ]),
523
+ ([- 1 ], [- 1 ]),
524
+ ([1 ], [1 ]),
525
+ ([- 1 ], [1 ]),
526
+ ([- 1 , - 2 ], [- 73 , - 10 ]),
527
+ ([1 , 2 ], [- 73 , - 10 ]),
528
+ ([1 , 2 , 3 ], [4 , 3 , 2 ]),
529
+ ([1 , 2 , 3 , 4 ], [4 , 3 , 2 , 1 ]),
530
+ ([1 , 2 , 3 , 4 , 5 ], [5 , 4 , 3 , 2 , 1 ]),
531
+ ([1 , 2 , 3 , 4 , 5 , 6 ], [6 , 5 , 4 , 3 , 2 , 1 ]),
532
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 ], [7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
533
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ], [8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ]),
534
+ ],
535
+ )
536
+ def test_dot_product_plain_inplace (context , vec1 , vec2 ):
537
+ context .generate_galois_keys ()
538
+ first_vec = ts .bfv_vector (context , vec1 )
539
+ second_vec = ts .plain_tensor (vec2 , dtype = "int" )
540
+ first_vec .dot_ (second_vec )
541
+ expected = [sum ([v1 * v2 for v1 , v2 in zip (vec1 , vec2 )])]
542
+
543
+ # Decryption
544
+ assert first_vec .decrypt () == expected , "Dot product of vectors is incorrect."
545
+
546
+
547
+ @pytest .mark .parametrize (
548
+ "vec1" ,
549
+ [
550
+ ([0 ]),
551
+ ([1 ]),
552
+ ([- 1 ]),
553
+ ([- 1 , - 2 ]),
554
+ ([1 , 2 ]),
555
+ ([1 , 2 , 3 ]),
556
+ ([1 , 2 , 3 , 4 ]),
557
+ ([1 , 2 , 3 , 4 , 5 ]),
558
+ ([1 , 2 , 3 , 4 , 5 , 6 ]),
559
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 ]),
560
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]),
561
+ ],
562
+ )
563
+ def test_sum (context , vec1 ):
564
+ context .generate_galois_keys ()
565
+ first_vec = ts .bfv_vector (context , vec1 )
566
+ result = first_vec .sum ()
567
+ expected = [sum (vec1 )]
568
+
569
+ # Decryption
570
+ assert result .decrypt () == expected , "Sum of vector is incorrect."
571
+ assert first_vec .decrypt () == vec1 , "Something went wrong in memory."
572
+
573
+
574
+ @pytest .mark .parametrize (
575
+ "vec1" ,
576
+ [
577
+ ([0 ]),
578
+ ([1 ]),
579
+ ([- 1 ]),
580
+ ([- 1 , - 2 ]),
581
+ ([1 , 2 ]),
582
+ ([1 , 2 , 3 ]),
583
+ ([1 , 2 , 3 , 4 ]),
584
+ ([1 , 2 , 3 , 4 , 5 ]),
585
+ ([1 , 2 , 3 , 4 , 5 , 6 ]),
586
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 ]),
587
+ ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]),
588
+ ],
589
+ )
590
+ def test_sum_inplace (context , vec1 ):
591
+ context .generate_galois_keys ()
592
+ first_vec = ts .bfv_vector (context , vec1 )
593
+ result = first_vec .sum ()
594
+ expected = [sum (vec1 )]
595
+
596
+ # Decryption
597
+ decrypted_result = result .decrypt ()
598
+ assert decrypted_result == expected , "Sum of vector is incorrect."
0 commit comments