예제 #1
0
 public function test($repeat = 100)
 {
     while ($repeat--) {
         $keep1 = array();
         $keep2 = array();
         $ll1 = new HyperLogLog\MinHash();
         $ll2 = new HyperLogLog\MinHash();
         $total = 0;
         while (1) {
             $total++;
             $rand = $this->random();
             $keep1[$rand] = 1;
             $ll1->add($rand);
             $rand = $this->random();
             $keep2[$rand] = 1;
             $ll2->add($rand);
             if (($count = count($keep2)) >= $this->i) {
                 break;
             }
         }
         $intersection = \HyperLogLog\Utils\MinHashIntersector::count(array($ll1, $ll2));
         $actual = count(array_intersect_key($keep1, $keep2));
         if ($actual == 0 || $intersection == 0) {
             continue;
         }
         $ll1->union($ll2);
         $total = $ll1->count();
         $this->average[0] += $actual;
         $this->average[1] += $intersection;
         $this->average[2] += $total;
         $this->results[] = array($actual, $intersection, $total);
     }
 }
$set1 = randomSet(110000);
$set2 = randomSet(0);
$set3 = randomSet(120000);
echo "Number of words in set 1: " . count($set1) . "\n";
echo "Number of words in set 2: " . count($set2) . "\n";
echo "Number of words in set 3: " . count($set3) . "\n";
echo "------\n";
echo "Cardinailiy of set 1: " . cardinality($set1) . "\n";
echo "Cardinailiy of set 2: " . cardinality($set2) . "\n";
echo "Cardinailiy of set 3: " . cardinality($set3) . "\n";
$intersection = array_intersect($set1, $set2, $set3);
$union = array_merge($set1, $set2, $set3);
$intersectionCount = cardinality($intersection);
echo "Cardinailiy of union: " . cardinality($union) . "\n";
echo "Cardinailiy of intersection: " . $intersectionCount . "\n";
echo "------\nLogLog\n";
$log_logs = array();
foreach (array($set1, $set2, $set3) as $i => $set) {
    $log_log = new HyperLogLog\MinHash();
    foreach ($set as $word) {
        $log_log->add($word);
    }
    $log_logs[] = $log_log;
    echo "Added set " . ($i + 1) . "\n";
}
$count = \HyperLogLog\Utils\MinHashIntersector::count($log_logs);
echo "intersection complete: count: {$count}\n";
if ($count) {
    echo "Error: 100% - count should be zero\n";
}
echo "Error: 0% - count is zero\n";
예제 #3
0
 public function test($repeat = 100)
 {
     while ($repeat--) {
         $ll1 = new HyperLogLog\MinHash();
         $ll2 = new HyperLogLog\MinHash();
         $i = 100000000 + $this->random();
         $r = mt_rand(1, 4);
         $end = $i + $this->i * $r;
         $actual = 0;
         $overlap = 0;
         while ($i <= $end) {
             $ll1->add($i);
             if (++$overlap === 2) {
                 $overlap = 0;
                 $ll2->add($i);
                 $actual++;
             }
             $i += $r;
         }
         $intersection = \HyperLogLog\Utils\MinHashIntersector::count(array($ll1, $ll2));
         $ll1->union($ll2);
         $total = $ll1->count();
         $this->average[0] += $actual;
         $this->average[1] += $intersection;
         $this->average[2] += $total;
         $this->results[] = array($actual, $intersection, $total);
     }
 }