LearningSet.cpp

/*

libcudann

Copyright (C) 2011 Luca Donati (lucadonati85@gmail.com)

*/

/*

 * LearningSet.cpp

 *

 *  Created on: 19/nov/2010

 *      Author: donati

 */

#include <stdio.h>

#include <stdlib.h>

#include "LearningSet.h"

LearningSet::LearningSet(){

numOfInstances=0;

numOfInputsPerInstance=0;

numOfOutputsPerInstance=0;

inputs=NULL;

outputs=NULL;

}

/* constructor from txt file (.fann format)

 * format is:

 *

 * NUMBER_OF_ISTANCES

 * NUMBER_OF_INPUTS_PER_ISTANCE

 * NUMBER_OF_OUTPUTS_PER_ISTANCE

 *

 * INPUT1 INPUT2 INPUT3 ...

 * OUTPUT1 OUTPUT2 OUTPUT3 ...

 *

 * INPUT1 INPUT2 INPUT3 ...

 * OUTPUT1 OUTPUT2 OUTPUT3 ...

 *

 * INPUT1 INPUT2 INPUT3 ...

 * OUTPUT1 OUTPUT2 OUTPUT3 ...

 *

 * .

 * .

 * .

 *

 * spaces or \n do not matter

 */

LearningSet::LearningSet(const char * s) {

FILE * f;

f=fopen(s,"r");

//file not found

if (f!=NULL){

//file wrong format

if(fscanf(f,"%d",&numOfInstances)<1){printf("WRONG LEARNING SET FILE FORMAT\n");exit(1);}

if(fscanf(f,"%d",&numOfInputsPerInstance)<1){printf("WRONG LEARNING SET FILE FORMAT\n");exit(1);}

if(fscanf(f,"%d",&numOfOutputsPerInstance)<1){printf("WRONG LEARNING SET FILE FORMAT\n");exit(1);}

inputs = new float[numOfInstances*numOfInputsPerInstance];

outputs = new float[numOfInstances*numOfOutputsPerInstance];

for(int i=0;i<numOfInstances;i++){

for(int j=0;j<numOfInputsPerInstance;j++)

if(fscanf(f,"%f",&inputs[i*numOfInputsPerInstance+j])<1){printf("WRONG LEARNING SET FILE FORMAT\n");exit(1);}

for(int j=0;j<numOfOutputsPerInstance;j++)

if(fscanf(f,"%f",&outputs[i*numOfOutputsPerInstance+j])<1){printf("WRONG LEARNING SET FILE FORMAT\n");exit(1);}

}

fclose(f);

}

else{printf("COULDN'T OPEN THE LEARNING SET FILE\n");exit(1);}

}

// copy constructor

LearningSet::LearningSet(const LearningSet & oldSet){

numOfInstances=oldSet.numOfInstances;

numOfInputsPerInstance=oldSet.numOfInputsPerInstance;

numOfOutputsPerInstance=oldSet.numOfOutputsPerInstance;

inputs = new float[numOfInstances*numOfInputsPerInstance];

outputs = new float[numOfInstances*numOfOutputsPerInstance];

for(int i=0;i<numOfInstances;i++){

for(int j=0;j<numOfInputsPerInstance;j++)

inputs[i*numOfInputsPerInstance+j]=oldSet.inputs[i*numOfInputsPerInstance+j];

for(int j=0;j<numOfOutputsPerInstance;j++)

outputs[i*numOfOutputsPerInstance+j]=oldSet.outputs[i*numOfOutputsPerInstance+j];

}

}

LearningSet & LearningSet::operator = (const LearningSet & oldSet){

if (this != &oldSet){ // protect against invalid self-assignment

// 1: allocate new memory and copy the elements

numOfInstances=oldSet.numOfInstances;

numOfInputsPerInstance=oldSet.numOfInputsPerInstance;

numOfOutputsPerInstance=oldSet.numOfOutputsPerInstance;

float * new_inputs = new float[numOfInstances*numOfInputsPerInstance];

float * new_outputs = new float[numOfInstances*numOfOutputsPerInstance];

for(int i=0;i<numOfInstances;i++){

for(int j=0;j<numOfInputsPerInstance;j++)

new_inputs[i*numOfInputsPerInstance+j]=oldSet.inputs[i*numOfInputsPerInstance+j];

for(int j=0;j<numOfOutputsPerInstance;j++)

new_outputs[i*numOfOutputsPerInstance+j]=oldSet.outputs[i*numOfOutputsPerInstance+j];

} // 2: deallocate old memory

delete [] inputs;

delete [] outputs;

// 3: assign the new memory to the object

inputs=new_inputs;

outputs=new_outputs;

}

// by convention, always return *this

return *this;

}

LearningSet::~LearningSet() {

delete [] inputs;

delete [] outputs;

}

float *LearningSet::getInputs() const

{

    return inputs;

}

int LearningSet::getNumOfInputsPerInstance() const

{

    return numOfInputsPerInstance;

}

int LearningSet::getNumOfInstances() const

{

    return numOfInstances;

}

int LearningSet::getNumOfOutputsPerInstance() const

{

    return numOfOutputsPerInstance;

}

float *LearningSet::getOutputs() const

{

    return outputs;

}