You are here

function commerce_reports_patterns_frequent_itemset in Commerce Reporting 7.3

Same name and namespace in other branches
  1. 7.4 modules/patterns/commerce_reports_patterns.batch.inc \commerce_reports_patterns_frequent_itemset()
1 string reference to 'commerce_reports_patterns_frequent_itemset'
commerce_reports_patterns_form_submit in modules/patterns/commerce_reports_patterns.admin.inc

File

modules/patterns/commerce_reports_patterns.batch.inc, line 52

Code

function commerce_reports_patterns_frequent_itemset(&$context) {
  if (empty($context['sandbox'])) {
    $context['sandbox']['set_length'] = 2;
    $context['sandbox']['current_partition'] = 0;
    $context['sandbox']['first_itemset'] = 0;
    $context['sandbox']['second_itemset'] = 1;
  }
  $length = $context['sandbox']['set_length'];
  if (empty($context['results']['frequent_sets'][$length - 1])) {
    return;
  }
  if (empty($context['results']['frequent_sets'][$length])) {
    $context['results']['frequent_sets'][$length] = array();
  }
  $prev_partitions =& $context['results']['frequent_sets'][$length - 1];
  $prev_partitions_count = count($prev_partitions);
  for ($x = 0; $x < 50; $x++) {
    if (!empty($prev_partitions[$context['sandbox']['current_partition']])) {
      $partition_itemset_count = count($prev_partitions[$context['sandbox']['current_partition']]['sets']);
    }
    else {
      $partition_itemset_count = 0;
    }
    $a = $context['sandbox']['first_itemset'];
    $b = $context['sandbox']['second_itemset'];
    if ($context['sandbox']['second_itemset'] >= $partition_itemset_count) {
      if ($context['sandbox']['first_itemset'] >= $partition_itemset_count) {
        if ($context['sandbox']['current_partition'] >= $prev_partitions_count) {
          $context['sandbox']['current_partition'] = 0;
          $context['sandbox']['set_length']++;
          break;
        }
        else {
          $context['sandbox']['current_partition']++;
        }
        $context['sandbox']['first_itemset'] = 0;
      }
      else {
        $context['sandbox']['first_itemset']++;
      }
      $context['sandbox']['second_itemset'] = $context['sandbox']['first_itemset'] + 1;
      continue;
    }
    else {
      $context['sandbox']['second_itemset']++;
    }
    $partition =& $prev_partitions[$context['sandbox']['current_partition']];
    $partition_prefix =& $partition['prefix'];
    $partition_itemset =& $partition['sets'];
    $a_set =& $partition_itemset[$a];
    $b_set =& $partition_itemset[$b];
    $candidate = array(
      'items' => array_values(array_unique(array_merge($a_set['items'], $b_set['items']))),
      'tidlist' => array_intersect($a_set['tidlist'], $b_set['tidlist']),
    );
    $occurences = max(count($candidate['tidlist']), 0);
    if ($occurences >= $context['results']['minimum_transactions']) {
      $new_items = array_diff($candidate['items'], $partition_prefix);
      $prefix = array_merge($partition_prefix, array(
        reset($new_items),
      ));
      _commerce_reports_patterns_add_set($context['results']['frequent_sets'][$length], $prefix, $candidate);
    }
  }
  if ($count = count($context['results']['frequent_sets'][$length])) {
    $context['finished'] = 0;
    $context['message'] = t('Generated %count frequent item sets with length %length', array(
      '%count' => $count,
      '%length' => $length,
    ));
  }
  else {
    unset($context['results']['frequent_sets'][$length]);
  }
}