@@ -0,0 +1,149 @@
package algorithm;

public class Food {

private Preference food_preference;

private int food_counter = 0;
private int id = 0;
private final double TEMP = 0.98;
private final double USER_INFLUENCE = 0.95;
private String name = "";

public Food( int id, String name, double sourness, double spiciness, double sweetness, double bitterness, double fattiness, int food_counter){

this.id = id;
this.name = name;
this.food_preference = new Preference( sourness, spiciness, sweetness, bitterness, fattiness );
this.food_counter = food_counter;
}

public Food( String name , String artist, Preference food_preference ){

this.food_preference = food_preference;
this.name = name;
}

public Food( String name, double sourness, double spiciness, double sweetness, double bitterness, double fattiness, int food_counter){

this.name = name;
this.food_preference = new Preference( sourness, spiciness, sweetness, bitterness, fattiness );
}

public Preference preference(){ return food_preference; }

public int counter(){ return food_counter; }

public void setCounter(int new_counter){ this.food_counter = new_counter; }

public int id(){ return id; }

public String name(){ return name; }

public double sourness(){ return food_preference.sourness(); }

public void setSourness( double sourness) { this.food_preference.SetSourness(sourness); }

public double spiciness(){ return food_preference.spiciness(); }

public void setSpiciness( double spiciness) { this.food_preference.SetSpiciness(spiciness); }

public double sweetness(){ return food_preference.sweetness(); }

public void setSweetness( double sweetness) { this.food_preference.SetSweetness(sweetness); }

public double bitterness(){ return food_preference.bitterness(); }

public void setBitterness( double bitterness) { this.food_preference.SetBitterness(bitterness); }

public double fattiness(){ return food_preference.fattiness(); }

public void setFattiness( double fattiness) { this.food_preference.SetFattiness(fattiness); }

public void UpdateSourness( double user_sourness, ModificationType mod_type, int user_counter )
{
double sourness;

sourness = sourness() + UserToFoodInfluenceFactor( user_counter, sourness(), user_sourness, mod_type );
food_preference.SetSourness( sourness );

food_counter++;
}

public void UpdateSpiciness( double user_spiciness, ModificationType mod_type, int user_counter )
{
double spiciness;

spiciness = spiciness() + UserToFoodInfluenceFactor( user_counter, spiciness(), user_spiciness, mod_type );
food_preference.SetSpiciness( spiciness );

food_counter++;
}

public void UpdateSweetness( double user_sweetness, ModificationType mod_type, int user_counter )
{
double sweetness;

sweetness = sweetness() + UserToFoodInfluenceFactor( user_counter, sweetness(), user_sweetness, mod_type );
food_preference.SetSweetness( sweetness );

food_counter++;
}

public void UpdateBitterness( double user_bitterness, ModificationType mod_type, int user_counter )
{
double bitterness;

bitterness = bitterness() + UserToFoodInfluenceFactor( user_counter, bitterness(), user_bitterness, mod_type );
food_preference.SetBitterness( bitterness );

food_counter++;
}

public void UpdateFattiness( double user_fattiness, ModificationType mod_type, int user_counter )
{
double fattiness;

fattiness = fattiness() + UserToFoodInfluenceFactor( user_counter, fattiness(), user_fattiness, mod_type );
food_preference.SetFattiness( fattiness );

food_counter++;
}

private double UserToFoodInfluenceFactor( int user_counter, double food_value, double user_value, ModificationType mod_type )
{
double influence_factor = 0;

switch( mod_type ){

case PERFECT:
{
influence_factor = ( food_value + user_value ) / 2 - food_value;
break;
}
case TOO_LOW:
{
influence_factor = -Math.abs( user_value - food_value );
if(influence_factor>-1.0){
//Preference is incorrect, compensate
influence_factor = -2.0;
}
break;
}
case TOO_MUCH:
{
influence_factor = Math.abs( user_value - food_value );
if(influence_factor<1.0){
//Preference is incorrect, compensate
influence_factor = 2.0;
}
break;
}
}

double result = //( 1 - Math.pow( USER_INFLUENCE, user_counter ) ) *
Math.pow(TEMP, food_counter) * influence_factor;

return result;
}
}
@@ -1,58 +1,126 @@
package algorithm;

public class Preference {

private final double LOWER_BOUND = 0.0;
private final double UPPER_BOUND = 10.0;

private double heaviness;
private double tempo;
private double complexity;

public Preference( double heaviness, double tempo, double complexity )
{
this.heaviness = heaviness;
this.tempo = tempo;
this.complexity = complexity;
}

public double heaviness()
{
return heaviness;
}

public void SetHeaviness( double heaviness)
{
this.heaviness = heaviness;

if( this.heaviness < LOWER_BOUND ) this.heaviness = 1;
if( this.heaviness > UPPER_BOUND ) this.heaviness = 10;
}

public double tempo()
{
return tempo;
}

public void SetTempo( double tempo)
{
this.tempo = tempo;

if( this.tempo < LOWER_BOUND ) this.tempo = 1;
if( this.tempo > UPPER_BOUND ) this.tempo = 10;
}

public double complexity()
{
return complexity;
}

public void SetComplexity( double complexity)
{
this.complexity = complexity;

if( this.complexity < LOWER_BOUND ) this.complexity = 1;
if( this.complexity > UPPER_BOUND ) this.complexity = 10;
}

private final double LOWER_BOUND = 0.0;
private final double UPPER_BOUND = 10.0;

private double sourness;
private double spiciness;
private double sweetness;
private double bitterness;
private double fattiness;

private double heaviness;
private double tempo;
private double complexity;

public Preference( double sweetness, double spiciness, double sourness, double bitterness, double fattiness)
{
this.sweetness = sweetness;
this.spiciness = spiciness;
this.sourness = sourness;
this.bitterness = bitterness;
this.fattiness = fattiness;
}

public Preference( double heaviness, double tempo, double complexity )
{
this.heaviness = heaviness;
this.tempo = tempo;
this.complexity = complexity;
}

public double sweetness(){ return sweetness; }

public void SetSweetness( double sweetness )
{
this.sweetness = sweetness;

if( this.sweetness < LOWER_BOUND ) this.sweetness = 1;
if( this.sweetness > UPPER_BOUND ) this.sweetness = 10;
}

public double spiciness() { return spiciness; }

public void SetSpiciness( double spiciness )
{
this.spiciness = spiciness;

if( this.spiciness < LOWER_BOUND ) this.spiciness = 1;
if( this.spiciness > UPPER_BOUND ) this.spiciness = 10;
}

public double sourness() { return sourness; }

public void SetSourness( double sourness )
{
this.sourness = sourness;

if( this.sourness < LOWER_BOUND ) this.sourness = 1;
if( this.sourness > UPPER_BOUND ) this.sourness = 10;
}

public double bitterness(){ return bitterness; }

public void SetBitterness( double bitterness)
{
this.bitterness = bitterness;

if( this.bitterness < LOWER_BOUND ) this.bitterness = 1;
if( this.bitterness > UPPER_BOUND ) this.bitterness = 10;
}

public double fattiness(){ return fattiness; }

public void SetFattiness( double fattiness )
{
this.fattiness = fattiness;

if( this.fattiness < LOWER_BOUND ) this.fattiness = 1;
if( this.fattiness > UPPER_BOUND ) this.fattiness = 10;
}


//All below deprecated
//TODO: Delete everything below
public double heaviness()
{
return heaviness;
}

public void SetHeaviness( double heaviness)
{
this.heaviness = heaviness;

if( this.heaviness < LOWER_BOUND ) this.heaviness = 1;
if( this.heaviness > UPPER_BOUND ) this.heaviness = 10;
}

public double tempo()
{
return tempo;
}

public void SetTempo( double tempo)
{
this.tempo = tempo;

if( this.tempo < LOWER_BOUND ) this.tempo = 1;
if( this.tempo > UPPER_BOUND ) this.tempo = 10;
}

public double complexity()
{
return complexity;
}

public void SetComplexity( double complexity)
{
this.complexity = complexity;

if( this.complexity < LOWER_BOUND ) this.complexity = 1;
if( this.complexity > UPPER_BOUND ) this.complexity = 10;
}

}