Skip to content

Commit

Permalink
Don't need to store local copy of ratings -- get speedup by passing.
Browse files Browse the repository at this point in the history
  • Loading branch information
WebDrake committed Apr 27, 2012
1 parent 54c9a25 commit 4d2a8a0
Showing 1 changed file with 16 additions and 18 deletions.
34 changes: 16 additions & 18 deletions dregs/codetermine.d
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ struct CoDetermination(alias This, alias ObjectReputation, alias UserDivergence,
UserID = size_t, ObjectID = size_t, Reputation = double)
{
private immutable Reputation convergence_;
private Rating!(UserID, ObjectID, Reputation)[] ratings_;
private Reputation[] reputationUser_;
private Reputation[] divergenceUser_;
private size_t[] linksUser_;
Expand All @@ -36,20 +35,19 @@ struct CoDetermination(alias This, alias ObjectReputation, alias UserDivergence,
divergenceUser_.length = users;
reputationObject_.length = objects;
reputationObjectOld_.length = objects;
ratings_ = ratings;

userReputationInit;
objectReputationInit;
userReputationInit(ratings);
objectReputationInit(ratings);

Reputation diff;
size_t iterations = 0;

do {
userDivergence;
userReputation;
userDivergence(ratings);
userReputation(ratings);

reputationObjectOld_[] = reputationObject_[];
objectReputation;
objectReputation(ratings);
diff = 0;
foreach(size_t o, Reputation rep; reputationObject_) {
auto aux = rep - reputationObjectOld_[o];
Expand Down Expand Up @@ -132,10 +130,10 @@ mixin template ThisDKVDlinear(UserID = size_t, ObjectID = size_t, Reputation = d

mixin template ObjectReputationInitBasic(UserID = size_t, ObjectID = size_t, Reputation = double)
{
private final pure nothrow void objectReputationInit()
private final pure nothrow void objectReputationInit(Rating!(UserID, ObjectID, Reputation)[] ratings)
{
weightSum_.length = reputationObject_.length;
objectReputation;
objectReputation(ratings);
}
}

Expand All @@ -146,7 +144,7 @@ mixin template ObjectReputationWeightedAverage(UserID = size_t, ObjectID = size_

mixin ObjectReputationInitBasic!(UserID, ObjectID, Reputation);

private final pure nothrow void objectReputation()
private final pure nothrow void objectReputation(Rating!(UserID, ObjectID, Reputation)[] ratings)
in
{
assert(weightSum_.length == reputationObject_.length);
Expand All @@ -156,7 +154,7 @@ mixin template ObjectReputationWeightedAverage(UserID = size_t, ObjectID = size_
weightSum_[] = 0;
reputationObject_[] = 0;

foreach(r; ratings_) {
foreach(r; ratings) {
reputationObject_[r.object] += reputationUser_[r.user] * r.weight;
weightSum_[r.object] += reputationUser_[r.user];
}
Expand All @@ -169,11 +167,11 @@ mixin template ObjectReputationWeightedAverage(UserID = size_t, ObjectID = size_

mixin template UserDivergenceSquare(UserID = size_t, ObjectID = size_t, Reputation = double)
{
private final pure nothrow userDivergence()
private final pure nothrow userDivergence(Rating!(UserID, ObjectID, Reputation)[] ratings)
{
divergenceUser_[] = 0;

foreach(r; ratings_) {
foreach(r; ratings) {
Reputation aux = r.weight - reputationObject_[r.object];
divergenceUser_[r.user] += aux*aux;
}
Expand All @@ -183,12 +181,12 @@ mixin template UserDivergenceSquare(UserID = size_t, ObjectID = size_t, Reputati

mixin template UserReputationInitBasic(UserID = size_t, ObjectID = size_t, Reputation = double)
{
private final pure nothrow void userReputationInit()
private final pure nothrow void userReputationInit(Rating!(UserID, ObjectID, Reputation)[] ratings)
{
linksUser_.length = reputationUser_.length;
linksUser_[] = 0;

foreach(r; ratings_)
foreach(r; ratings)
linksUser_[r.user]++;

reputationUser_[] = 1.0;
Expand All @@ -202,7 +200,7 @@ mixin template UserReputationInversePower(UserID = size_t, ObjectID = size_t, Re

mixin UserReputationInitBasic!(UserID, ObjectID, Reputation);

private final pure nothrow void userReputation()
private final pure nothrow void userReputation(Rating!(UserID, ObjectID, Reputation)[] ratings)
in
{
assert(exponent_ >= 0);
Expand All @@ -227,7 +225,7 @@ mixin template UserReputationExponential(UserID = size_t, ObjectID = size_t, Rep

mixin UserReputationInitBasic!(UserID, ObjectID, Reputation);

private final pure nothrow void userReputation()
private final pure nothrow void userReputation(Rating!(UserID, ObjectID, Reputation)[] ratings)
in
{
assert(exponent_ >= 0);
Expand All @@ -250,7 +248,7 @@ mixin template UserReputationLinear(UserID = size_t, ObjectID = size_t, Reputati

mixin UserReputationInitBasic!(UserID, ObjectID, Reputation);

private final pure nothrow void userReputation()
private final pure nothrow void userReputation(Rating!(UserID, ObjectID, Reputation)[] ratings)
in
{
assert(minDivergence_ > 0);
Expand Down

0 comments on commit 4d2a8a0

Please sign in to comment.