mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/** Client and Server classes for parallel optimization using CFMPI.**/
 | 
						|
#include "ParallelObjective.h"
 | 
						|
 | 
						|
/** Set up MPI Client-Server support for objective optimization.
 | 
						|
@param obj `Objective' to parallelize
 | 
						|
@param DONOTUSECLIENT TRUE (default): client node does no object evaluation<br>FALSE after putting servers to work Client node does one evaluation.
 | 
						|
**/
 | 
						|
ParallelObjective(obj,DONOTUSECLIENT) {
 | 
						|
	if (isclass(obj.p2p)) {oxwarning("P2P object already exists for "+obj.L+". Nothing changed"); return;}
 | 
						|
	obj.p2p = new P2P(DONOTUSECLIENT,new ObjClient(obj),new ObjServer(obj));
 | 
						|
	}
 | 
						|
 | 
						|
ObjClient::ObjClient(obj) { this.obj = obj;    }
 | 
						|
 | 
						|
ObjClient::Execute() {    }
 | 
						|
 | 
						|
ObjServer::ObjServer(obj) {
 | 
						|
    this.obj = obj;
 | 
						|
    basetag = P2P::STOP_TAG+1;
 | 
						|
    iml = obj.NvfuncTerms;
 | 
						|
    Nparams = obj.nstruct;
 | 
						|
    }
 | 
						|
 | 
						|
/** Wait on the objective client.
 | 
						|
**/
 | 
						|
ObjServer::Loop(nxtmsgsz) {
 | 
						|
    Nparams = nxtmsgsz;   //free param length is no greater than Nparams
 | 
						|
    if (Volume>QUIET) println("ObjServer server ",ID," Nparams ",Nparams);
 | 
						|
    Server::Loop(Nparams);
 | 
						|
    Recv(ANY_TAG);                      //receive the ending parameter vector
 | 
						|
    obj->Encode(Buffer[:Nparams-1]);   //encode it.
 | 
						|
    }
 | 
						|
 | 
						|
/** Do the objective evaluation.
 | 
						|
Receive structural parameter vector and `Objective::Encode`() it.
 | 
						|
Call `Objective::vfunc`().
 | 
						|
@return Nparams (max. length of next expected message);
 | 
						|
**/
 | 
						|
ObjServer::Execute() {
 | 
						|
	obj->Decode(Buffer[:obj.nfree-1]);
 | 
						|
	Buffer = obj.cur.V[] = obj->vfunc();
 | 
						|
    if (Volume>QUIET) println("Server Executive: ",ID," vfunc[0]= ",Buffer[0]);
 | 
						|
	return obj.nstruct;
 | 
						|
	}
 | 
						|
 | 
						|
CstrServer::CstrServer(obj) { ObjServer(obj);	}
 | 
						|
 | 
						|
SepServer::SepServer(obj) { ObjServer(obj);	}
 | 
						|
 | 
						|
CstrServer::Execute() {
 | 
						|
	obj->Encode(Buffer);
 | 
						|
	obj->Lagrangian(0);
 | 
						|
	return rows(Buffer = obj.cur->Vec());
 | 
						|
	}
 | 
						|
 | 
						|
/** Separable objective evaluations.
 | 
						|
**/
 | 
						|
SepServer::Execute() {
 | 
						|
	obj.Kvar.v = imod(Tag-basetag,obj.K);
 | 
						|
	obj->Encode(Buffer,TRUE);
 | 
						|
	Buffer = obj.Kvar->PDF() * obj->vfunc();
 | 
						|
	return obj.NvfuncTerms;
 | 
						|
	}
 |