Skip to content

Commit

Permalink
A lifetime of changes...
Browse files Browse the repository at this point in the history
  • Loading branch information
seliquity committed Apr 21, 2011
1 parent 363e511 commit d91399e
Show file tree
Hide file tree
Showing 60 changed files with 12,525 additions and 973 deletions.
84 changes: 43 additions & 41 deletions DataSet/FileDataSet.class.php
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
<?php

require_once(dirname(__FILE__) . '/../interfaces/DataSet.interface.php');
require_once(dirname(__FILE__) . '/GenericDataSet.class.php');

class FileDataSet implements DataSet {
private $_dataSet;

public function __construct($file) {
$fh = fopen($file, 'rb');
if (!$fh) throw new RuntimeException('Could not open file');

$builder = new GenericDataSetBuilder();

// add each line at a time to builder
// (using a builder as GenericDataSet is immutable)
while (!feof($fh) && $line = fgets($fh)) {
list($userId, $itemId, $rating) = explode("\t", $line);

$builder->loadLine($userId, $itemId, $rating);
}

fclose($fh);

$this->_dataSet = $builder->build();
}

public function getUserIds() { return $this->_dataSet->getUserIds(); }
public function getItemIds() { return $this->_dataSet->getItemIds(); }

public function getNumUsers() { return $this->_dataSet->getNumUsers(); }
public function getNumItems() { return $this->_dataSet->getNumItems(); }

public function isUser($userId) { return $this->_dataSet->isUser($userId); }
public function isItem($itemId) { return $this->_dataSet->isItem($itemId); }

public function getUser($userId) { return $this->_dataSet->getUser($userId); }
public function getItem($itemId) { return $this->_dataSet->getItem($itemId); }

public function getUserRatingsArray($user) { return $this->_dataSet->getUserRatingsArray($user); }
public function getItemRatingsArray($item) { return $this->_dataSet->getItemRatingsArray($item); }
<?php

require_once(dirname(__FILE__) . '/../Interfaces/DataSet.interface.php');
require_once(dirname(__FILE__) . '/GenericDataSet.class.php');

class FileDataSet implements DataSet {
protected $_dataSet;

public function __construct($file, $ratingRange) {
$fh = fopen($file, 'rb');
if (!$fh) throw new RuntimeException('Could not open file');

$builder = new GenericDataSetBuilder($ratingRange);

// add each line at a time to builder
// (using a builder as GenericDataSet is immutable)
while (!feof($fh) && $line = fgets($fh)) {
list($userId, $itemId, $rating) = explode("\t", $line);

$builder->loadLine($userId, $itemId, $rating);
}

fclose($fh);
$this->_dataSet = $builder->build();
}

public function getUserIds() { return $this->_dataSet->getUserIds(); }
public function getItemIds() { return $this->_dataSet->getItemIds(); }

public function getNumUsers() { return $this->_dataSet->getNumUsers(); }
public function getNumItems() { return $this->_dataSet->getNumItems(); }

public function isUser($userId) { return $this->_dataSet->isUser($userId); }
public function isItem($itemId) { return $this->_dataSet->isItem($itemId); }

public function getUser($userId) { return $this->_dataSet->getUser($userId); }
public function getItem($itemId) { return $this->_dataSet->getItem($itemId); }

public function getUserRatingsArray($user) { return $this->_dataSet->getUserRatingsArray($user); }
public function getItemRatingsArray($item) { return $this->_dataSet->getItemRatingsArray($item); }

public function getRatingMin() { return $this->_dataSet->getRatingMin(); }
public function getRatingMax() { return $this->_dataSet->getRatingMax(); }
}
269 changes: 149 additions & 120 deletions DataSet/GenericDataSet.class.php
Original file line number Diff line number Diff line change
@@ -1,121 +1,150 @@
<?php

require_once(dirname(__FILE__) . '/../interfaces/DataSet.interface.php');
require_once(dirname(__FILE__) . '/../Model/User.class.php');
require_once(dirname(__FILE__) . '/../Model/Item.class.php');

final class GenericDataSet implements DataSet {
// $_users['userId']['itemId'] = rating (integer)
// $_items['itemId']['userId'] = rating (integer)
private $_users;
private $_items;

private $_userNum;
private $_itemNum;

public function __construct($users, $items) {
if (!is_array($users) || !is_array($items))
throw new InvalidArgumentException();

$this->_users = &$users;
$this->_items = &$items;

$this->_userNum = count($users);
$this->_itemNum = count($items);
}

public function getUserIds() { return array_keys($this->_users); }
public function getItemIds() { return array_keys($this->_items); }

public function getNumUsers() { return $this->_userNum; }
public function getNumItems() { return $this->_itemNum; }

public function isUser($userId) { return isset($this->_users[$userId]); }
public function isItem($itemId) { return isset($this->_items[$itemId]); }

public function getUser($userId) {
if (!isset($this->_users[$userId]))
throw new InvalidArgumentException();

return new User($userId, $this->_users[$userId]);
}

public function getItem($itemId) {
if (!isset($this->_items[$itemId]))
throw new InvalidArgumentException();

return new Item($itemId, $this->_items[$itemId]);
}

public function getUserRatingsArray($user) {
if (is_object($user)) {
if (!($user instanceof User))
throw new InvalidArgumentException('Not instance of User');

$user = $user->getId();
}

if (!isset($this->_users[$user]))
throw new InvalidArgumentException('Invalid user ID');

return $this->_users[$user];
}

public function getItemRatingsArray($item) {
if (is_object($item)) {
if (!($user instanceof Item))
throw new InvalidArgumentException('Not instance of Item');

$item = $item->getId();
}

if (!isset($this->_items[$item]))
throw new InvalidArgumentException('Invalid item ID');

return $this->_items[$item];
}
}

class GenericDataSetBuilder {
// $_users['userId']['itemId'] = rating (integer)
// $_items['itemId']['userId'] = rating (integer)
private $_users;
private $_items;

private $_built;

public function __construct() {
$this->_users = array();
$this->_items = array();

$this->_built = false;
}

public function build() {
if ($this->_built) return;

$dataSet = new GenericDataSet($this->_users, $this->_items);

unset($this->_users);
unset($this->_items);

$this->_built = true;
return $dataSet;
}

public function loadLine($userId, $itemId, $rating) {
if ($this->_built) return;

// user array
if (isset($this->_users[$userId]))
$this->_users[$userId][$itemId] = $rating;
else
$this->_users[$userId] = array($itemId => $rating);

// item array
if (isset($this->_items[$itemId]))
$this->_items[$itemId][$userId] = $rating;
else
$this->_items[$itemId] = array($userId => $rating);
}
<?php

require_once(dirname(__FILE__) . '/../Interfaces/DataSet.interface.php');
require_once(dirname(__FILE__) . '/../Model/User.class.php');
require_once(dirname(__FILE__) . '/../Model/Item.class.php');

class GenericDataSet implements DataSet {
// $_users['userId']['itemId'] = rating (integer)
// $_items['itemId']['userId'] = rating (integer)
private $_users;
private $_items;

private $_userNum;
private $_itemNum;

private $_ratingMin;
private $_ratingMax;

// $rating_range = array(start_value, end_value) e.g array(1,5)
public function __construct($users, $items, $rating_range) {
if (!is_array($users) || !is_array($items))
throw new InvalidArgumentException();

if (!is_array($rating_range) || count($rating_range) != 2
|| !is_numeric($rating_range[0]) || !is_numeric($rating_range[1])
|| $rating_range[0] > $rating_range[1])
throw new InvalidArgumentException();

$this->_users = &$users;
$this->_items = &$items;

$this->_userNum = count($users);
$this->_itemNum = count($items);

$this->_ratingMin = $rating_range[0];
$this->_ratingMax = $rating_range[1];
}

public function getUserIds() { return array_keys($this->_users); }
public function getItemIds() { return array_keys($this->_items); }

public function getNumUsers() { return $this->_userNum; }
public function getNumItems() { return $this->_itemNum; }

public function isUser($userId) { return isset($this->_users[$userId]); }
public function isItem($itemId) { return isset($this->_items[$itemId]); }

public function getUser($userId) {
if (!isset($this->_users[$userId]))
throw new InvalidArgumentException();

return new User($userId, $this->_users[$userId]);
}

public function getItem($itemId) {
if (!isset($this->_items[$itemId]))
throw new InvalidArgumentException();

return new Item($itemId, $this->_items[$itemId]);
}

public function getUserRatingsArray($user) {
if (is_object($user)) {
if (!($user instanceof User))
throw new InvalidArgumentException('Not instance of User');

$user = $user->getId();
}

if (!isset($this->_users[$user]))
throw new InvalidArgumentException('Invalid user ID');

return $this->_users[$user];
}

public function getItemRatingsArray($item) {
if (is_object($item)) {
if (!($item instanceof Item))
throw new InvalidArgumentException('Not instance of Item');

$item = $item->getId();
}

if (!isset($this->_items[$item]))
throw new InvalidArgumentException('Invalid item ID');

return $this->_items[$item];
}

public function getRatingMin() { return $this->_ratingMin; }
public function getRatingMax() { return $this->_ratingMax; }
}

class GenericDataSetBuilder {
// $_users['userId']['itemId'] = rating (integer)
// $_items['itemId']['userId'] = rating (integer)
private $_users;
private $_items;

private $_range;
private $_built;

public function __construct($range) {
$this->_users = array();
$this->_items = array();

$this->_range = $range;
$this->_built = false;
}

public function build() {
if ($this->_built) return;

$dataSet = new GenericDataSet($this->_users, $this->_items, $this->_range);

unset($this->_users);
unset($this->_items);

$this->_built = true;
return $dataSet;
}

public function getParams() {
return array($this->_users, $this->_items, $this->_range);
}

public function loadLine($userId, $itemId, $rating) {
if ($this->_built) return;

// user array
if ($userId != null) {
if (isset($this->_users[$userId]))
$this->_users[$userId][$itemId] = $rating;
elseif ($itemId == null)
$this->_users[$userId] = array();
else
$this->_users[$userId] = array($itemId => $rating);
}

// item array
if ($itemId != null) {
if (isset($this->_items[$itemId]))
$this->_items[$itemId][$userId] = $rating;
elseif ($userId == null)
$this->_items[$itemId] = array();
else
$this->_items[$itemId] = array($userId => $rating);
}
}
}
Loading

0 comments on commit d91399e

Please sign in to comment.