// // MPT_DataLoader.m // AUCoderDemo // // Created by Andrew Salamon on 11/13/06. // Copyright 2006 Machine Perception Laboratory, University of California San Diego.. All rights reserved. // #import "MPT_DataLoader.h" #import #import "MPT_PluginController.h" #import "MPT_PluginProtocolSVM.h" #import static const int niMax = 9; static const int muMax = 8; typedef std::pair pluginAndWeights; typedef std::vector< pluginAndWeights > pluginPairVector; @interface MPT_DataLoader(PrivateMethods) - (void)checkForErrors; @end @implementation MPT_DataLoader - (id)initWithDelegate:(id)_delegate { if( self = [super init] ) { delegate = _delegate; errors = [[NSMutableArray alloc] init]; pluginWeights = new pluginPairVector; MPT_PluginController *pluginController = [MPT_PluginController defaultController]; NSArray *plugins = [pluginController pluginsForStep:MPT_PluginStep_SVM]; NSEnumerator *pluginEnum = [plugins objectEnumerator]; id plugin; while( plugin = [pluginEnum nextObject] ) { NSString *name = [plugin internalName]; mp_SVMWeights *pluginWeight = mp_SVMWeights::getSVMWeights( [name UTF8String] ); pluginWeight->setDirectory( [[plugin weightsDirectory] UTF8String] ); ((pluginPairVector *)pluginWeights)->push_back( pluginAndWeights(plugin,pluginWeight) ); } } return self; } - (void)dealloc { delete (pluginPairVector *)pluginWeights; [errors release]; [super dealloc]; } - (int)weightsFileCount { return niMax * muMax; } - (NSArray *)errors { return errors; } - (void)loadAllWeights { // We need an autorelease pool because we're called on a separate thread. // This is currently not a problem but it is good practice. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for( int ni=1; ni <= niMax; ++ni ) { for( int mu=1; mu <= muMax; ++mu ) { for( pluginPairVector::iterator iter = ((pluginPairVector *)pluginWeights)->begin(), lastWeight = ((pluginPairVector *)pluginWeights)->end(); iter != lastWeight; ++iter ) { pluginAndWeights &tmp = *iter; mp_SVMWeights *pluginWeight = tmp.second; pluginWeight->getWeights( ni, mu ); } [delegate performSelectorOnMainThread:@selector(incrementWeightsProgress) withObject:nil waitUntilDone:NO]; } } [self checkForErrors]; [pool release]; } - (void)checkForErrors { for( pluginPairVector::iterator iter = ((pluginPairVector *)pluginWeights)->begin(), lastWeight = ((pluginPairVector *)pluginWeights)->end(); iter != lastWeight; ++iter ) { pluginAndWeights &tmp = *iter; mp_SVMWeights *pluginWeight = tmp.second; if( pluginWeight->getLoadError() ) { id plugin = tmp.first; [errors addObject:plugin]; } } [delegate performSelectorOnMainThread:@selector(loaderFinished:) withObject:self waitUntilDone:NO]; } @end