/* This file was automatically generated by fcc. Do not modify. */

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#include "xps.h"

/* ------------------------------------------------------------ */

#ifndef min
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif

#define FC_IS_F    1
#define FC_ISNOT_F 2
#define FC_IS_C    3
#define FC_ISNOT_C 4
#define FLMEMF_AgeYoung 0
#define FLMEMF_AgeMiddle 1
#define FLMEMF_AgeOld 2
#define FLMEMF_SpeedLow 0
#define FLMEMF_SpeedMedium 1
#define FLMEMF_SpeedHigh 2
#define FLMEMF_CarVW 0
#define FLMEMF_CarPorsche 1
#define FLMEMF_CarBMW 2
static int flmemfunc_subsets[3] = {3,3,3};
#define FLVAR_Age 0
#define FLVAR_Speed 1
#define FLVAR_Car 2
#define FL_NUMVARIABLES 3

/* ------------------------------------------------------------ */

static int    flvariable_set[FL_NUMVARIABLES]; 
static double flvariable_val[FL_NUMVARIABLES]; 
static double flvariable_def[FL_NUMVARIABLES] = {0,0,0};
static double flvarAge[3];
static double flvarSpeed[3];
static double flvarCar[3];
/* ------------------------------------------------------------ */

static void FL_Initialize(int all)

{
  register int i;

  if (all)
     for (i = 0; i < FL_NUMVARIABLES; i++)
         {
          flvariable_set[i] = 0;

         }

  for (i = 0; i < 3; i++)
      flvarAge[i] = 0.0;
  for (i = 0; i < 3; i++)
      flvarSpeed[i] = 0.0;
  for (i = 0; i < 3; i++)
      flvarCar[i] = 0.0;
}

/* ------------------------------------------------------------ */

static double FL_MemshipAgeYoung(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 18.000000);
  if ((value >= 18.000000) && (delta <= 20.000000))
     result = 1.0 - delta * 0.050000;
  else
  if (value <= 18.000000)
     result = 1.000000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipAgeMiddle(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 35.000000);
  if ((value >= 35.000000) && (delta <= 20.000000))
     result = 1.0 - delta * 0.050000;
  else
    if ((value <= 35.000000) && (delta <= 10.000000))
       result = 1.0 - delta * 0.100000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipAgeOld(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 55.000000);
  if ((value >= 55.000000) && (delta <= 30.000000))
     result = 1.0 - delta * 0.033333;
  else
    if ((value <= 55.000000) && (delta <= 10.000000))
       result = 1.0 - delta * 0.100000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipSpeedLow(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 100.000000);
  if ((value >= 100.000000) && (delta <= 20.000000))
     result = 1.0 - delta * 0.050000;
  else
    if ((value <= 100.000000) && (delta <= 20.000000))
       result = 1.0 - delta * 0.050000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipSpeedMedium(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 130.000000);
  if ((value >= 130.000000) && (delta <= 30.000000))
     result = 1.0 - delta * 0.033333;
  else
    if ((value <= 130.000000) && (delta <= 30.000000))
       result = 1.0 - delta * 0.033333;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipSpeedHigh(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 200.000000);
  if ((value >= 200.000000) && (delta <= 50.000000))
     result = 1.0 - delta * 0.020000;
  else
    if ((value <= 200.000000) && (delta <= 50.000000))
       result = 1.0 - delta * 0.020000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipCarVW(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - -100.000000);
  if ((value >= -100.000000) && (delta <= 20.000000))
     result = 1.000000;
  else
    if ((value <= -100.000000) && (delta <= 20.000000))
       result = 1.000000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipCarPorsche(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 0.000000);
  if ((value >= 0.000000) && (delta <= 20.000000))
     result = 1.000000;
  else
    if ((value <= 0.000000) && (delta <= 20.000000))
       result = 1.000000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipCarBMW(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 100.000000);
  if ((value >= 100.000000) && (delta <= 20.000000))
     result = 1.000000;
  else
    if ((value <= 100.000000) && (delta <= 20.000000))
       result = 1.000000;
  return(result);
}

/* ------------------------------------------------------------ */

void FL_SetxpsAge(double value)

{
  flvariable_val[FLVAR_Age] = value;
}

/* ------------------------------------------------------------ */

void FL_SetxpsSpeed(double value)

{
  flvariable_val[FLVAR_Speed] = value;
}

/* ------------------------------------------------------------ */

void FL_SetxpsCar(double value)

{
  flvariable_val[FLVAR_Car] = value;
}

/* ------------------------------------------------------------ */

double FL_GetxpsAge(void)

{
  if (flvariable_set[FLVAR_Age])
     return(flvariable_val[FLVAR_Age]);
  return(flvariable_def[FLVAR_Age]);
}

/* ------------------------------------------------------------ */

double FL_GetxpsSpeed(void)

{
  if (flvariable_set[FLVAR_Speed])
     return(flvariable_val[FLVAR_Speed]);
  return(flvariable_def[FLVAR_Speed]);
}

/* ------------------------------------------------------------ */

double FL_GetxpsCar(void)

{
  if (flvariable_set[FLVAR_Car])
     return(flvariable_val[FLVAR_Car]);
  return(flvariable_def[FLVAR_Car]);
}

/* ------------------------------------------------------------ */

static void FL_RuleAge2SpeedRule1(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipAgeYoung(flvariable_val[FLVAR_Age]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Speed] = 1; 
   flvarSpeed[FLMEMF_SpeedHigh]     = max(result,flvarSpeed[FLMEMF_SpeedHigh]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleAge2SpeedRule2(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipAgeMiddle(flvariable_val[FLVAR_Age]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Speed] = 1; 
   flvarSpeed[FLMEMF_SpeedMedium]     = max(result,flvarSpeed[FLMEMF_SpeedMedium]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleAge2SpeedRule3(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipAgeOld(flvariable_val[FLVAR_Age]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Speed] = 1; 
   flvarSpeed[FLMEMF_SpeedLow]     = max(result,flvarSpeed[FLMEMF_SpeedLow]); 
}

/* ------------------------------------------------------------ */

static void FL_ObjectAge2Speed(void)

{
   register int    i,defuzzify;
   register double sum,value;

   /* Reset Variable Speed */
   flvariable_set[FLVAR_Speed] = 0;
   for (i = 0; i < 3; i++)
      flvarSpeed[i] = 0.0;
   FL_RuleAge2SpeedRule1();
   FL_RuleAge2SpeedRule2();
   FL_RuleAge2SpeedRule3();
   /* Evaluate Variable Speed */
   for (defuzzify = 0, i = 0; ((i < 3) && (!defuzzify)); i++)
       if (flvarSpeed[i] > 0.0)
          defuzzify = 1;

   if (defuzzify)
      {
       sum = 0;
       for (i = 0; i < 3; i++)
           sum += flvarSpeed[i];
       value = 0;
       value += (flvarSpeed[0] * 100.000000);
       value += (flvarSpeed[1] * 130.000000);
       value += (flvarSpeed[2] * 200.000000);
       flvariable_val[FLVAR_Speed] = value/sum;
      }
}
static void FL_RuleSpeed2CarRule1(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipSpeedHigh(flvariable_val[FLVAR_Speed]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Car] = 1; 
   flvarCar[FLMEMF_CarPorsche]     = max(result,flvarCar[FLMEMF_CarPorsche]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleSpeed2CarRule2(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipSpeedMedium(flvariable_val[FLVAR_Speed]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Car] = 1; 
   flvarCar[FLMEMF_CarBMW]     = max(result,flvarCar[FLMEMF_CarBMW]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleSpeed2CarRule3(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipSpeedLow(flvariable_val[FLVAR_Speed]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Car] = 1; 
   flvarCar[FLMEMF_CarVW]     = max(result,flvarCar[FLMEMF_CarVW]); 
}

/* ------------------------------------------------------------ */

static void FL_ObjectSpeed2Car(void)

{
   register int    i,defuzzify;
   register double sum,value;

   /* Reset Variable Car */
   flvariable_set[FLVAR_Car] = 0;
   for (i = 0; i < 3; i++)
      flvarCar[i] = 0.0;
   FL_RuleSpeed2CarRule1();
   FL_RuleSpeed2CarRule2();
   FL_RuleSpeed2CarRule3();
   /* Evaluate Variable Car */
   for (defuzzify = 0, i = 0; ((i < 3) && (!defuzzify)); i++)
       if (flvarCar[i] > 0.0)
          defuzzify = 1;

   if (defuzzify)
      {
       sum = 0;
       for (i = 0; i < 3; i++)
           sum += flvarCar[i];
       value = 0;
       value += (flvarCar[0] * -100.000000);
       value += (flvarCar[1] * 0.000000);
       value += (flvarCar[2] * 100.000000);
       flvariable_val[FLVAR_Car] = value/sum;
      }
}
void FL_Runxps(void)

{
   FL_ObjectAge2Speed();
   FL_ObjectSpeed2Car();
}


/* ------------------------------------------------------------ */

int main(int argc, char **argv)

{
  register int i;
  if (argc != FL_NUMVARIABLES+1)
     {
      printf("Error: Need 3 inputs\n");
      return(1);
     }

  for (i = 1; i < argc; i++)
      flvariable_val[i-1] = atof(argv[i]);
  FL_Runxps();
  for (i = 0; i < FL_NUMVARIABLES; i++)
      printf("%g ",flvariable_val[i]);
  printf("\n");
  return(0);
}

