//
//  EXPModel.h
//  dde
//
//  Created by Ashley on 21/07/2007.
//  Copyright 2007 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "EXPVirtualMachine.h"

@class EXPSymbolTable;
@class EXPError;
@class EXPParser;
@class EXPBlockElement;
@class EXPVirtualMachine;
@class PLTMatrix;

@interface EXPModel : EXPVirtualMachine {
	NSString *_name;
	
	NSArray *_variableNames;
	NSArray *_auxiliaryNames;
	
	EXPSymbolTable *_symbolTable;	
	EXPBlockElement *_block;
	NSMutableDictionary *_options;
	
	BOOL _printAll;
	BOOL _printHeadings;
	NSString *_outputFormat;
	
	NSArray *_switchAddresses;
	NSArray *_mapAddresses;
	
//	FILE *_file;

	long _histSize;
	double _t0;
	double _t1;
	double _dt;
	double _eps;
	double _outputStep;

	PLTMatrix *_outputValues;	
	int _nEvaluations;

	int _dimensionStartAddress;
	int _variableStartAddress;
	int _gradientStartAddress;
	int _parameterStartAddress;
	int _auxiliaryStartAddress;
	int _switchesStartAddress;
	int _tablesStartAddress;
	int _startTimeAddress;
	int _stopTimeAddress;
	int _timeAddress;
	
	int _dataTop;
	int _codeTop;
	
	int _parameterInitialisationAddress;
	int _variableInitialisationAddress;
	int _auxiliaryComputationAddress;
	int _variableComputationAddress;
	int _outputtersExecutionAddress;
	int _printHeaderAddress;
	int _printFooterAddress;
	int _switchesExecutionAddress;
	int _mapExecutionAddress;
	int _washupExecutionAddress;
	
	int _outputRowCounter;
	PLTMatrix *_matrix;
	NSString *_listfileName;
	
	NSArray *_delays;
	NSArray *_outputters;

	int _nConstants;
	int _nVariables;
	int _nSwitches;

}

- (void) setName:(NSString *)name;
- (NSString *)name;

- (void) setSymbolTable:(id)symbolTable;
- (id) symbolTable;
- (void) setBlock:(id)block;
- (id) block;

- (void) setPrintAll:(BOOL)printAll;
- (BOOL) printAll;
- (void) setPrintHeadings:(BOOL)printHeadings;
- (BOOL) printHeadings;
- (void) setOutputFormat:(id)outputFormat;
- (id) outputFormat;

- (void) setOutputMatrix:(id)matrix;
- (id) outputMatrix;
- (void) setRowCounter:(int)row;
- (int) rowCounter;
- (void) setListFilename:(id)name;
- (id) listFilename;

- (void) setVariableNames:(id)variableNames;
- (id) variableNames;
- (void) setAuxiliaryNames:(id)auxiliaryNames;
- (id) auxiliaryNames;

- (id) option:(NSString *)name;
- (void) setOption:(id) value forName:(NSString *)name;
- (BOOL) processOption:(EXPParser *)parser;
- (void) setConstants:(NSDictionary *)constants;
- (int) nEvaluations;

- (int) nConstants;
- (void) setNConstants:(int) newNConstants;
- (int) nAuxiliaries;
- (void) setNAuxiliaries:(int) newNAuxiliaries;
- (int) nVariables;
- (void) setNVariables:(int) newNVariables;
- (void) setNSwitches:(int)nSwitches;
- (int) nSwitches;
- (void) setDelays:(id)delays;
- (id) delays; 

- (void) setDelays:(id)delays;
- (id) delays; 
- (void) setOutputters:(id)outputters;
- (id) outputters;
- (void) setSwitchAddresses:(id)switchAddresses;
- (id) switchAddresses;
- (void) setMapAddresses:(id)mapAddresses;
- (id) mapAddresses;
- (void) setDimensionStartAddress:(int)dimensionStartAddress;
- (int) dimensionStartAddress;
- (void) setVariableStartAddress:(int)variableStartAddress;
- (int) variableStartAddress;
- (void) setGradientStartAddress:(int)gradientStartAddress;
- (int) gradientStartAddress;
- (void) setParameterStartAddress:(int)parameterStartAddress;
- (int) parameterStartAddress;
- (void) setAuxiliaryStartAddress:(int)auxiliaryStartAddress;
- (int) auxiliaryStartAddress;
- (void) setTablesStartAddress:(int)tablesStartAddress;
- (int) tablesStartAddress;
- (void) setSwitchesExecutionAddress:(int)switchesExecutionAddress;
- (int) switchesExecutionAddress;
- (void) setSwitchesStartAddress:(int)switchesStartAddress;
- (int) switchesStartAddress;
- (void) setMapExecutionAddress:(int)mapExecutionAddress;
- (int) mapExecutionAddress;
- (void) setOutputtersExecutionAddress:(int)outputtersExecutionAddress;
- (int) outputtersExecutionAddress;
- (void)setPrintHeaderAddress:(int)printHeaderAddress;
- (int) printHeaderAddress;
- (void)setPrintFooterAddress:(int)printFooterAddress;
- (int) printFooterAddress;
- (void) setParameterInitialisationAddress:(int)parameterInitialisationAddress;
- (int) parameterInitialisationAddress;
- (void) setVariableInitialisationAddress:(int)variableInitialisationAddress;
- (int) variableInitialisationAddress;
- (void) setAuxiliaryComputationAddress:(int)auxiliaryComputationAddress;
- (int) auxiliaryComputationAddress;
- (void) setVariableComputationAddress:(int)variableComputationAddress;
- (int) variableComputationAddress;
- (void) setWashupExecutionAddress:(int)washupExecutionAddress;
- (int) washupExecutionAddress;

- (void) setDataTop:(int)dataTop;
- (int) dataTop;
- (void) setCodeTop:(int)codeTop;
- (int) codeTop;

- (void) setStartTimeAddress:(int)startTimeAddress;
- (int) startTimeAddress;
- (void) setStopTimeAddress:(int)stopTimeAddress;
- (int) stopTimeAddress;
- (void) setTimeAddress:(int)timeAddress;
- (int) timeAddress;
- (void) setTime:(double)time;
- (void) setStartTime:(double)startTime;
- (double) startTime;
- (void) setStopTime:(double)stopTime;
- (double) stopTime;

- (void) dumpVariables;

- (BOOL) writeToFile:(NSString *)fileName;

- (int) nLag;
- (void) setNSwitches:(int)nSwitches;
- (int) nSwitches;
- (BOOL) print;

- (void) output:(double *)s gradients:(double *)g time:(double)t;
- (void) initConstants;
- (void) stateScale:(double *)scale;
- (void) initState:(double *)state;
- (void) switchFunctions:(double *)sw newState:(double *)s time:(double)t;
- (void) map:(double *)s time:(double)t switchNo:(int)swno;
- (BOOL) gradients:(double *)grad forState:(double *)state atTime:(double)t;
- (void) storeHistory:(double *)his gradientsHistory:(double *)ghis gradients:(double *)gradients state:(double *)state time:(double)t;

@end