Esempio n. 1
0
DataSource * RandTime :: FromXML( const ALib::XMLElement * e ) {
	ForbidChildren( e );
	AllowAttrs( e, AttrList( BEGIN_ATTRIB, END_ATTRIB, MODE_ATTR,
								ORDER_ATTRIB, 0 ));
	bool havemode = false;
	TimeRep begin, end, mode;
	try {
		if ( e->HasAttr( BEGIN_ATTRIB ) || e->HasAttr( END_ATTRIB ) ) {
			begin = TimeRep( e->AttrValue( BEGIN_ATTRIB ) );
			end = TimeRep( e->AttrValue( END_ATTRIB ) );
			if ( begin.AsInt() >= end.AsInt() ) {
				throw Exception( "begin must be before end" );
			}
		}

		if ( e->HasAttr( MODE_ATTR ) ) {
			havemode = true;
			mode = TimeRep( e->AttrValue( MODE_ATTR ) );
		}
	}
	catch( const Exception & ex ) {
		XMLERR( e, ex.what() );
	}

//	std::cout << begin.Str() <<" " << end.Str() << std::endl;

	if ( havemode ) {
		return new RandTime( GetOrder( e ), begin, end, mode );
	}
	else {
		return new RandTime( GetOrder( e ), begin, end );
	}
}
Esempio n. 2
0
 bool CppECGroup::IsProbablyValid() const
 {
   return IsElement(GetGenerator()) && 
     IsIdentity(Exponentiate(GetGenerator(), GetOrder())) &&
     CryptoPP::IsPrime(_curve.FieldSize()) &&
     GetOrder().IsPrime();
 }
Esempio n. 3
0
File: VQModel.cpp Progetto: nykm/sop
void VQModel::Train(const std::vector< DynamicVector<Real> >& samples, unsigned int iterations)
{
    LBG lbg(GetOrder());

    mClusterWeights.resize(GetOrder());
    
    ResetWeights();

    std::vector<unsigned int> indices;

    lbg.Cluster(samples, indices, mClusterCentroids, mClusterSizes);
}
Esempio n. 4
0
DataSource * TimeSeq :: FromXML( const ALib::XMLElement * e ) {
	ForbidChildren( e );
	AllowAttrs( e, AttrList( BEGIN_ATTRIB, END_ATTRIB,
								INC_ATTRIB, ORDER_ATTRIB, 0 ));
	RequireAttrs( e, AttrList( BEGIN_ATTRIB, END_ATTRIB, 0 ) );

	TimeRep begin, end;

	try {
		begin = TimeRep(  e->AttrValue( BEGIN_ATTRIB ) );
		end = TimeRep( e->AttrValue( END_ATTRIB ) );
		if ( begin.AsInt() >= end.AsInt() ) {
			throw Exception( "begin must be before end" );
		}
	}
	catch ( const Exception & ex ) {
		XMLERR( e, ex.what() );
	}
	int inc = GetInt( e, INC_ATTRIB, "1" );
	if ( inc <= 0  || inc >= 24 * 60 * 60 ) {
		XMLERR( e, "Invalid increment: "  << inc );
	}

	return new TimeSeq( GetOrder( e ), begin, end, inc );

}
Esempio n. 5
0
DataSource * DSSelect :: FromXML( const ALib::XMLElement * e ) {
	AllowAttrs( e, AttrList( ORDER_ATTRIB,  0 ) );
	RequireChildren( e );
	CheckKids( e );
	std::auto_ptr <DSSelect> sl( new DSSelect( GetOrder( e ) ) );
	sl->AddChildSources( e );
	return sl.release();
}
Esempio n. 6
0
float CTElection::GetRetRate( u_long idPlayer )
{	// 입찰금 반환율
	int nOrder	= GetOrder( idPlayer );
	nOrder	= min( nOrder, IElection::nMaxCandidates );
	if( nOrder < 0 )
		return 0.0F;
	return property.m_vReturnDepositRates[nOrder];
}
Esempio n. 7
0
void PageConfigData::Fitcurve(double dx[],double dy[],int nNum,int nCol)
{
	double dParam[5] = {0,0,0,0,0};
	int ma = GetOrder();
	Polyfit(dx,dy,nNum, dParam,ma);
	m_Param.SetParam(dParam,ma,nCol);
	UpDataCurve(GetCurve(nCol),dParam,ma);
	UpDataMaxFLow(dx,nNum);
}
Esempio n. 8
0
// Masks don't need to be validated as all characters do something
DataSource * DSMasked :: FromXML( const ALib::XMLElement * e ) {

	ForbidChildren( e );
	RequireAttrs( e, MASK_ATTRIB );
	AllowAttrs( e, AttrList( MASK_ATTRIB, ORDER_ATTRIB, 0 ) );

	string mask = e->AttrValue( MASK_ATTRIB );
	return new DSMasked( GetOrder( e ), mask );
}
Esempio n. 9
0
void FbAuthListThread::DoLetter(FbSQLite3Database &database)
{
	wxString sql = wxT("SELECT id, full_name FROM authors");
	sql << GetJoin();
	if (m_info.m_letter) sql << wxT("WHERE letter=?");
	sql << GetOrder();
	FbSQLite3Statement stmt = database.PrepareStatement(sql);
	if (m_info.m_letter) stmt.Bind(1, (wxString)m_info.m_letter);
	FbSQLite3ResultSet result = stmt.ExecuteQuery();
	MakeModel(result);
}
Esempio n. 10
0
void FbAuthListThread::DoFullText(FbSQLite3Database &database)
{
	wxString sql = wxT("SELECT docid, full_name FROM fts_auth INNER JOIN authors ON id=docid");
	sql << GetJoin();
	sql << wxT("WHERE fts_auth MATCH ?");
	sql << GetOrder();
	FbSQLite3Statement stmt = database.PrepareStatement(sql);
	stmt.FTS(1, m_info.m_string);
	FbSQLite3ResultSet result = stmt.ExecuteQuery();
	MakeModel(result);
}
Esempio n. 11
0
void FbAuthListThread::DoString(FbSQLite3Database &database)
{
	wxString sql = wxT("SELECT id, full_name FROM authors");
	sql << GetJoin();
	sql << wxT("WHERE SEARCH(full_name)");
	sql << GetOrder();
	FbSearchFunction search(m_info.m_string);
	database.CreateFunction(wxT("SEARCH"), 1, search);
	FbSQLite3ResultSet result = database.ExecuteQuery(sql);
	MakeModel(result);
}
Esempio n. 12
0
DataSource * DSCase :: FromXML( const ALib::XMLElement * e ) {

	if ( e->Parent() == 0 || e->Parent()->Name() != SELECT_TAG ) {
		XMLERR( e, "case must be part of select" );
	}

	AllowAttrs( e, AttrList( ORDER_ATTRIB, VALUES_ATTR, 0 ) );
	RequireChildren( e );
	string values = e->AttrValue( VALUES_ATTR, "" );

	std::auto_ptr <DSCase> cs( new DSCase( GetOrder( e ), values ) );
	cs->AddChildSources( e );
	return cs.release();
}
Esempio n. 13
0
// unique supports the following  attributes:
//	order	- usual stuff
//	fields	- list of fields to consider for uniqueness
//	retry	- number of time sto retry getting unique row
DataSource * DSUnique :: FromXML( const ALib::XMLElement * e ) {

	RequireChildren( e );
	AllowAttrs( e, AttrList( ORDER_ATTRIB,FIELDS_ATTRIB, RETRY_ATTRIB, 0 ) );

	string fl = e->AttrValue( FIELDS_ATTRIB, "" );
	FieldList cmpf( fl );
	int retry = GetInt( e, RETRY_ATTRIB, ALib::Str( UNIQUE_RETRY) );
	if ( retry < 0 ) {
		throw XMLError( ALib::SQuote( RETRY_ATTRIB ) + " cannot be negative", e );
	}

	std::auto_ptr <DSUnique> c( new DSUnique( GetOrder( e ), cmpf , retry ));

	c->AddChildSources( e );
	return c.release();

}
Esempio n. 14
0
void Game::Start(int Round)
{
    for(int i=1;i<=Round;i++)
    {
        double Max=0;
        int Luck=0;
        Packet RedPacket(PacketMoney,PacketQuota);
        GetOrder();
        for(int j=1;j<=PacketQuota;j++)
        {
            double Get=RedPacket.GetMoney();
            int Index=Order[j];
            Money[Index]+=Get;
        }
        Luck=Debug.Statistics(Money,PacketMoney);
        Money[Luck]-=PacketMoney;
    }    
}
Esempio n. 15
0
void JapaneseContextAnalysis::HandleData(const char* aBuf, PRUint32 aLen)
{
  PRUint32 charLen;
  PRInt32 order;
  PRUint32 i;

  if (mDone)
    return;

  //The buffer we got is byte oriented, and a character may span in more than one
  //buffers. In case the last one or two bytes in the last buffer is not complete, we
  //record how many bytes are needed to complete that character and skip those bytes here.
  //We can choose to record those bytes as well and analyze the character once it
  //is complete, but since a character will not make much difference, by skipping
  //this character we will simplify our logic and improve performance.
  for (i = mNeedToSkipCharNum; i < aLen; )
  {
    order = GetOrder(aBuf+i, &charLen);
    i+= charLen;
    if (i > aLen){
      mNeedToSkipCharNum = i - aLen;
      mLastCharOrder = -1;
    }
    else
    {
      if (order != -1 && mLastCharOrder != -1)
      {
        mTotalRel ++;
        if (mTotalRel > MAX_REL_THRESHOLD)
        {
          mDone = PR_TRUE;
          break;
        }
        mRelSample[int(jp2CharContext[mLastCharOrder][order])]++;
      }
      mLastCharOrder = order;
    }
  }

  return;
}
Esempio n. 16
0
bool BulletLauncher::Shoot()
{
	// 如果标记可以射击才会发射出子弹
	if (_bShoot)
	{
		Bullet* bullet = CreateBullet();
		bullet->SetPosition(
			GetPositionX(),
			GetPositionY(),
			GetPositionZ());
		bullet->SetAngleZ(GetAngleZ());
		bullet->SetDirectionAngle(GetAngleZ());
		bullet->SetOrder(GetOrder());
		_belongPlane->GetScene()->Add(bullet);
		// 发射过了,标记为不可发射
		_bShoot = false;

		return true;
	}

	return false;
}
Esempio n. 17
0
File: VQModel.cpp Progetto: nykm/sop
void VQModel::Init()
{
    if (mClusterCentroids.size() != GetOrder())
    {
        mClusterCentroids.resize(GetOrder());
    }

    if (mClusterSizes.size() != GetOrder())
    {
        mClusterSizes.resize(GetOrder());
    }
    
    if (mClusterWeights.size() != GetOrder())
    {
        mClusterWeights.resize(GetOrder());
    }
}
Esempio n. 18
0
 bool IntegerGroup::IsGenerator(const Element &a) const 
 {
   return IsElement(a) 
     && ((Exponentiate(a, GetOrder()) == GetIdentity()))
     && (!(Exponentiate(a, Integer(2)) == GetIdentity()));
 }
Esempio n. 19
0
 Integer CppECGroup::RandomExponent() const
 {
   return CryptoRandom().GetInteger(1, GetOrder(), false); 
 }
Esempio n. 20
0
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    Data data;
	mxArray *Im;
	int nof_dim;
    const int *elem_per_dim;
    int nargout;
    int i;
	
    
    // set default values
    SetDefaults(&data);
    
	// check number of input arguments
	if( (nrhs % 2 == 0) || (nrhs < 3 ) )
	{
		ErrorMessage(ERR_NARGIN);
        ClearMemory(&data);
		return;
	}
    
	// initialize that part of the data depending only on input image
    {
        if( !mxIsDouble(prhs[0]) ) // check if image is given as double
        {
            ErrorMessage(ERR_DOUBLE);
            ClearMemory(&data);
            return;
        }
        
        // get image dimensions
        nof_dim = mxGetNumberOfDimensions(prhs[0]);
        elem_per_dim = mxGetDimensions(prhs[0]);
        
        if( nof_dim > 3 )
        {
            ErrorMessage(ERR_DIM);
            ClearMemory(&data);
            return;
        }
        
        plhs[0] = mxDuplicateArray(prhs[0]); // output image
        Im = mxDuplicateArray(prhs[0]);      // smoothed image

        data.rows = elem_per_dim[0];
        data.cols = elem_per_dim[1];
        data.size = data.rows * data.cols;
        data.channels = 1;
        if( nof_dim == 3 )
            data.channels = elem_per_dim[2];
        
        data.Image = mxGetPr(plhs[0]);
        data.MImage = mxGetPr(Im); 
        
        data.Ihelp = (double *)AllocMem(sizeof(double) * data.channels);
        data.Tfield = (hItem *) AllocMem(sizeof(hItem) * data.size);
        data.Domain = (double *) AllocMem(sizeof(double) * data.size);
        data.MDomain = (double *) AllocMem(sizeof(double) * data.size);
        data.heap = (hItem **) AllocMem(sizeof(hItem *) * data.size);
        data.ordered_points = (double *) AllocMem(sizeof(double) * data.size *3);
        
        // number of output arguments
        if( nlhs <= 2 )
            nargout = nlhs;
        else
            nargout = 2;
    }
     
    
    // get and check arguments
    {
        char guidance_done = 0;
        char order_done = 0;
        char argname[100];
        int  len;
        int  err;
        
        for( i = 1 ; i < nrhs ; i = i+2 )
        {
            if( !mxIsChar( prhs[i] ) )
            {
                ErrorMessage(ERR_STRING);
                ClearMemory(&data);
                return;
            }
            else
            {
                len = mxGetN( prhs[i] );
                mxGetString( prhs[i], argname, len+1);
                
                //mexPrintf(" %s \n", argname);
                
                switch( argname[0] )
                {
                    case 'o': // orderD , orderT
                        {
                            if( !order_done )
                            {
                                if( !mxIsEmpty(prhs[i+1]) )
                                {
                                    if( argname[len-1] == 'D' )
                                    {
                                        err = GetMask( prhs[i+1], &data);
                                        data.ordergiven = 0;
                                    }
                                    else if( argname[len-1] == 'T' )
                                    {
                                        err = GetOrder( prhs[i+1], &data);
                                        data.ordergiven =1;
                                    }
                                    else
                                        err = ERR_UNKNOWN_ID;
                                }
                                else
                                    err = ERR_ARG_MISSING; 

                                order_done = 1;
                            }
                            break;
                        }
                                            
                    case 'g': // guidanceN , guidanceC , guidanceD
                        {
                            if( !guidance_done )
                            {
                                if( !mxIsEmpty(prhs[i+1]) )
                                {
                                    if( argname[len-1] == 'N' )
                                    {
                                        err = GetParam( prhs[i+1], &data, TYPE_N);
                                        data.guidance = 0;
                                    }
                                    else if( argname[len-1] == 'C' )
                                    {
                                        err = GetParam( prhs[i+1], &data, TYPE_C);
                                        data.guidance = 1;
                                    }
                                    else if( argname[len-1] == 'D' )
                                    {
                                        err = GetParam( prhs[i+1], &data, TYPE_D);
                                        data.guidance = 2;
                                    }
                                    else
                                        err = ERR_UNKNOWN_ID;
                                }
                                else
                                    err = ERR_ARG_MISSING;
                                
                                // guidance_done = 1;
                                if(data.GivenGuidanceT != NULL)
                                    data.guidance = 2;
                            }
                            break;
                        }
                        
                    default:
                        err = ERR_UNKNOWN_ID;
                        break;
                }
                    
                if( err )
                {
                    ErrorMessage(err);
                    ClearMemory(&data);
                    return;
                }
            }
        }
        
        if( !order_done ) // at least mask must be specified
        {
            ErrorMessage(ERR_NO_MASK_ORDER);
            ClearMemory(&data);
            return;
        }
    }
	
    
    if( data.guidance == 1)
        SetKernels(&data);
    
	InpaintImage(&data); 
    
    if(data.inpaint_undefined == 1)
    {
        mexPrintf("\n\n");
        mexPrintf("Error:\n");
        mexPrintf("Some inpainted image values are undefined !\n");
        mexPrintf("This happens if the order is not well-defined. \n");
        mexPrintf("You can find out the undefined pixels by: > ind = find( isnan(result) ) \n\n\n");
    }
        
        
    if( nargout == 2 )
    {
        double *p;
        int size;
        
        size = 3 * data.nof_points2inpaint;
        plhs[1] = mxCreateDoubleMatrix(3, data.nof_points2inpaint , mxREAL);
        p = mxGetPr(plhs[1]);
        
        for( i=0 ; i < size ; i++ )
            if( (i+1) % 3 != 0 )
                p[i] = data.ordered_points[i] + 1;
            else
                p[i] = data.ordered_points[i];
    }
    
    //CopyMask(&data);
    //CopyParam( &data );
    //CopyDirfield( &data );
    //CopyMImage( &data );
    //CopyTfield(&data);
    
    ClearMemory(&data);
	return;
}
int InputInteractionComponent::GetOrder() const
{
	auto renderer = m_GameObject->GetComponent<RendererComponent>();
	return renderer != nullptr ? renderer->GetOrder() : 0;
}
Esempio n. 22
0
File: VQModel.cpp Progetto: nykm/sop
void VQModel::Adapt(const std::shared_ptr<Model>& other, const std::vector< DynamicVector<Real> >& samples,
    unsigned int iterations, Real relevanceFactor)
{
    const VQModel* model = dynamic_cast<VQModel*>(other.get());

    if (model == nullptr)
    {
        std::cout << "Not VQModel." << std::endl;
        return;
    }

    SetOrder(model->GetOrder());
    Init();

    std::vector<unsigned int> indices(samples.size());

    // Initialize the feature vectors of the centroids.

    for (unsigned int c = 0; c < GetOrder(); c++)
    {
        mClusterCentroids[c] = model->mClusterCentroids[c];
    }

    // Do the iterations.
    for (unsigned int i = 0; i < iterations; i++)
    {
        //Find the closest centroid to each sample
        for (unsigned int n = 0; n < samples.size(); n++)
        {
            Real minDist = std::numeric_limits<Real>::max();

            for (unsigned int c = 0; c < GetOrder(); c++)
            {
                Real dist = samples[n].Distance(mClusterCentroids[c]);

                if (dist < minDist)
                {
                    minDist = dist;
                    indices[n] = c;
                }
            }
        }

        //Set the centroids to the average of the samples in each centroid
        for (unsigned int c = 0; c < GetOrder(); ++c)
        {
            mClusterCentroids[c].Assign(0.0f);

            mClusterSizes[c] = 0;
        }

        for (unsigned int s = 0; s < samples.size(); ++s)
        {
            mClusterCentroids[indices[s]].Add(samples[s]);

            ++mClusterSizes[indices[s]];
        }

        for (unsigned int c = 0; c < GetOrder(); ++c)
        {
            if (mClusterSizes[c] > 0)
            {
                mClusterCentroids[c].Multiply(1.0f / static_cast<Real>(mClusterSizes[c]));
            }
        }

        //Calculate the adapted values
        for (unsigned int c = 0; c < GetOrder(); ++c)
        {
            Real size = static_cast<Real>(mClusterSizes[c]);
            Real w = size / (size + static_cast<Real>(relevanceFactor));

            DynamicVector<Real> ubmc = model->mClusterCentroids[c];
            ubmc.Multiply(1.0f - w);

            mClusterCentroids[c].Multiply(w);
            mClusterCentroids[c].Add(ubmc);
        }
    }
}
Esempio n. 23
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { ALLOCATES();
  real     *X, XX[NN], Xk[NN], XXr[NN], D[N], DS[N], fD[N], V[NN], VS[NN], *O, Ok[NN];
  long     k1, K1, k2, K2, k3, K3, ii, jj;
  int      ORDER[N];
  char     STR[100];

  enum     symmetrize_ { NONE , X_Xt , Xt_X , PLUS };
  enum     symmetrize_ symmetrize;  
  
  enum     outs_types { ID , INVERSE , EIGVALS , EIGVECS , EIGVALSDIAG , MAXDIFF , SQRT , LOG , EXP , evalFUN , DET , TRACE };
  enum     outs_types outs[50];
  int      ndims, Odims[50];
  real     det;
  
  int      oid;
  int      D_computed, V_computed, D_sorted, V_sorted, ORDER_computed;
  int      dim1 , dim2;
  mxArray  *mxX;
  
  if( nlhs == 0 ){ nlhs = 1; }
  if( nlhs > nrhs-2 ){
    myErrMsgTxt("There are no enough inputs.\n");
  }

  if( mxIsCell( prhs[0] ) ){
    mxX = mxGetCell( prhs[0] , 0 );
    dim1 = myGetValue( mxGetCell( prhs[0] , 1 ) );
    dim2 = myGetValue( mxGetCell( prhs[0] , 2 ) );
  } else {
    mxX = prhs[0];
    dim1 = 1;
    dim2 = 2;
  }
  
  if( ( mySize( mxX , dim1-1 ) != N ) || ( mySize( mxX , dim1-1 ) != N ) ){
    myErrMsgTxt("size( X , %d ) and size( X , %d ) have to be equal to three.\n",dim1,dim2);
  }
  

  if( myIsEmpty( prhs[1] ) ){
    symmetrize = NONE;
  } else if( mxIsChar(prhs[1]) ){
    mxGetString( prhs[1], STR, 100 );
    
    if(        !myStrcmpi(STR,"+") ) {
      symmetrize = PLUS;
    } else if( !myStrcmpi(STR,"xt*x") || !myStrcmpi(STR,"xtx") ) {
      symmetrize = Xt_X;
    } else if( !myStrcmpi(STR,"x*xt") || !myStrcmpi(STR,"xxt") ) {
      symmetrize = X_Xt;
    } else {
      myErrMsgTxt("Second argument expected: 'xt*x' , 'x*xt' , '+' , or [].\n");
    }

  } else {
    myErrMsgTxt("Second argument expected: 'xt*x' , 'x*xt' , '+' , or [].\n");
  }
  

  for( oid = 0 ; oid < nlhs ; oid++ ){
    if( ! mxIsChar(prhs[oid+2]) ){
      myErrMsgTxt("Valids arguments are: 'id' 'eigval' 'eigvec' 'log' 'sqrt' 'exp' 'error'.\n");
    }
    mxGetString( prhs[oid+2], STR, 100 );
    
    if(        !myStrcmpi(STR,"id") ) {
      outs[oid] = ID;
    } else if( !myStrcmpi(STR,"inv") || !myStrcmpi(STR,"inverse") ) {
      outs[oid] = INVERSE;
    } else if( !myStrcmpi(STR,"det") ) {
      outs[oid] = DET;
    } else if( !myStrcmpi(STR,"trace") ) {
      outs[oid] = TRACE;
    } else if( !myStrcmpi(STR,"evec") || !myStrcmpi(STR,"v") || !myStrcmpi(STR,"eigenvec") || !myStrcmpi(STR,"eigvec") || !myStrcmpi(STR,"eigenvectors") ) {
      outs[oid] = EIGVECS;
    } else if( !myStrcmpi(STR,"eval") || !myStrcmpi(STR,"d") || !myStrcmpi(STR,"eigenval") || !myStrcmpi(STR,"eigval") || !myStrcmpi(STR,"eigenvalues") ) {
      outs[oid] = EIGVALS;
    } else if( !myStrcmpi(STR,"diag") || !myStrcmpi(STR,"dd") ) {
      outs[oid] = EIGVALSDIAG;
    } else if( !myStrcmpi(STR,"error") ) {
      outs[oid] = MAXDIFF;
    } else if( !myStrcmpi(STR,"sqrt") || !myStrcmpi(STR,"sqrtm") ) {
      outs[oid] = SQRT;
    } else if( !myStrcmpi(STR,"log") || !myStrcmpi(STR,"logm") ) {
      outs[oid] = LOG;
    } else if( !myStrcmpi(STR,"exp") || !myStrcmpi(STR,"expm") ) {
      outs[oid] = EXP;
    } else {
      myErrMsgTxt("Valids arguments are: 'id' 'inv' 'det' 'trace' 'eigval' 'eigvec' 'log' 'sqrt' 'exp' 'error'.\n");
    }
  }
  
  
  X = mxGetPr( mxX );
  ndims = myGetSizes( mxX , Odims );
  
  for( oid = 0 ; oid < nlhs ; oid++ ){
    switch( outs[oid] ){
      case ID:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );
        break;
      case INVERSE:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );
        break;
      case DET:
        Odims[dim1-1] = 1;
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        Odims[dim1-1] = N;
        Odims[dim2-1] = N;
        break;
      case TRACE:
        Odims[dim1-1] = 1;
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        Odims[dim1-1] = N;
        Odims[dim2-1] = N;
        break;
      case EIGVALS:
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );
        Odims[dim2-1] = N;
        break;
      case EIGVECS:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case EIGVALSDIAG:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case MAXDIFF:
        Odims[dim1-1] = 1;
        Odims[dim2-1] = 1;
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        Odims[dim1-1] = N;
        Odims[dim2-1] = N;
        break;
      case EXP:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case LOG:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case SQRT:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
      case evalFUN:
        plhs[oid] = mxCreateNumericArray( ndims , Odims , mxREAL_CLASS , mxREAL );        
        break;
    }
  }
  
  K1 = 1;
  for( k1 = 0    ; k1 < dim1-1 ; k1++ ){  K1 *= Odims[k1]; }
  K2 = 1;
  for( k2 = dim1 ; k2 < dim2-1 ; k2++ ){  K2 *= Odims[k2]; }
  K3 = 1;
  for( k3 = dim2 ; k3 < ndims  ; k3++ ){  K3 *= Odims[k3]; }


  for( k3 = 0 ; k3 < K3 ; k3++ ){
  for( k2 = 0 ; k2 < K2 ; k2++ ){
  for( k1 = 0 ; k1 < K1 ; k1++ ){
    if( K1 == 1 && K2 == 1 ){
      memcpy( Xk , X + k3*NN , NN*sizeof( real ) );
    } else {
      for( jj = 0 ; jj < N ; jj++ ){ for( ii = 0 ; ii < N ; ii++ ){
        Xk[ ii + N*jj ] = X[  k1 + K1*( ii + N*( k2 + K2*( jj + N*k3 ))) ];
      } }
    }
    
    
    switch( symmetrize ){
      case NONE:
        memcpy( XX , Xk , NN*sizeof( real ) );
        break;

      case X_Xt:
        XX[0] = Xk[0]*Xk[0] + Xk[2]*Xk[2];
        XX[1] = Xk[1]*Xk[0] + Xk[3]*Xk[2];

        XX[2] = Xk[0]*Xk[1] + Xk[2]*Xk[3];
        XX[3] = Xk[1]*Xk[1] + Xk[3]*Xk[3];
        break;

      case Xt_X:
        XX[0] = Xk[0]*Xk[0] + Xk[1]*Xk[1];
        XX[1] = Xk[2]*Xk[0] + Xk[3]*Xk[1];

        XX[2] = Xk[0]*Xk[2] + Xk[1]*Xk[3];
        XX[3] = Xk[2]*Xk[2] + Xk[3]*Xk[3];
        break;

      case PLUS:
        XX[0]         = Xk[0];
        XX[1] = XX[2] = ( Xk[1] + Xk[2] )/2.0;
        XX[3]         = Xk[3];
        break;
    }
    
    D_computed      = 0;
    V_computed      = 0;
    ORDER_computed  = 0;
    D_sorted        = 0;
    V_sorted        = 0;
    
    for( oid = 0 ; oid < nlhs ; oid++ ){
      switch( outs[oid] ){
        case ID:
          memcpy( Ok , XX , NN*sizeof( real ) );
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;
          
          
        case INVERSE:
          det = XX[0]*XX[3] - XX[1]*XX[2];
          det = 1.0/det;
          
          Ok[0] =  XX[3] *det;
          Ok[1] = -XX[1] *det;
          Ok[2] = -XX[2] *det;
          Ok[3] =  XX[0] *det;
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;
          

        case DET:
          Ok[0] = XX[0]*XX[3] - XX[1]*XX[2];
          
          O = mxGetPr( plhs[oid] );
          ToOutput1x1;
          break;

          
        case TRACE:
          Ok[0] =  XX[0] + XX[3];
          
          O = mxGetPr( plhs[oid] );
          ToOutput1x1;
          break;

          
        case EIGVALS:
          if( !D_computed     ){ EigenValues2x2( XX , D );          D_computed = 1;      }
          if( !ORDER_computed ){ GetOrder( D, ORDER );              ORDER_computed = 1;  }
          if( !D_sorted       ){ SortEigenValues( D, ORDER , DS );  D_sorted = 1;        }
          
          memcpy( Ok , DS , N*sizeof( real ) );
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x1;
          break;


        case EIGVALSDIAG:
          if( !D_computed     ){ EigenValues2x2( XX , D );          D_computed = 1;      }
          if( !ORDER_computed ){ GetOrder( D, ORDER );              ORDER_computed = 1;  }
          if( !D_sorted       ){ SortEigenValues( D, ORDER , DS );  D_sorted = 1;        }

          Ok[0] = DS[0];
          Ok[3] = DS[1];
          Ok[1] = Ok[2] = 0;

          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;

          
        case EIGVECS:
          if( !D_computed     ){ EigenValues2x2( XX , D );          D_computed = 1;      }
          if( !V_computed     ){ EigenVectors2x2( XX , D , V);      V_computed = 1;      }
          if( !ORDER_computed ){ GetOrder( D, ORDER );              ORDER_computed = 1;  }
          if( !V_sorted       ){ SortEigenVectors( V, ORDER , VS);  V_sorted = 1;        }

          memcpy( Ok , VS , NN*sizeof( real ) );
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;


//         case MAXDIFF:
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           Ok[0] = V[0]*V[0]*D[0] + V[3]*V[3]*D[1] + V[6]*V[6]*D[2];
//           Ok[1] = V[1]*V[0]*D[0] + V[4]*V[3]*D[1] + V[7]*V[6]*D[2];
//           Ok[2] = V[2]*V[0]*D[0] + V[5]*V[3]*D[1] + V[8]*V[6]*D[2];
// 
//           Ok[3] = V[0]*V[1]*D[0] + V[3]*V[4]*D[1] + V[6]*V[7]*D[2];
//           Ok[4] = V[1]*V[1]*D[0] + V[4]*V[4]*D[1] + V[7]*V[7]*D[2];
//           Ok[5] = V[2]*V[1]*D[0] + V[5]*V[4]*D[1] + V[8]*V[7]*D[2];
// 
//           Ok[6] = V[0]*V[2]*D[0] + V[3]*V[5]*D[1] + V[6]*V[8]*D[2];
//           Ok[7] = V[1]*V[2]*D[0] + V[4]*V[5]*D[1] + V[7]*V[8]*D[2];
//           Ok[8] = V[2]*V[2]*D[0] + V[5]*V[5]*D[1] + V[8]*V[8]*D[2];
// 
//           Ok[0] =  MAX9( fabs( Ok[0] - XX[0] ) ,
//                          fabs( Ok[1] - XX[1] ) ,
//                          fabs( Ok[2] - XX[2] ) ,
//                          fabs( Ok[3] - XX[3] ) ,
//                          fabs( Ok[4] - XX[4] ) ,
//                          fabs( Ok[5] - XX[5] ) ,
//                          fabs( Ok[6] - XX[6] ) ,
//                          fabs( Ok[7] - XX[7] ) ,
//                          fabs( Ok[8] - XX[8] ) );
// 
//           O = mxGetPr( plhs[oid] );
//           ToOutput1x1;
//           break;
// 
//           
//         case SQRT:
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           fD[0] = sqrt( D[0] );
//           fD[1] = sqrt( D[1] );
//           fD[2] = sqrt( D[2] );
//           
//           FillOk;
//           O = mxGetPr( plhs[oid] );
//           ToOutput3x3;
//           break;
// 
//           
//         case LOG:
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           fD[0] = log( D[0] );
//           fD[1] = log( D[1] );
//           fD[2] = log( D[2] );
//           
//           FillOk;
//           O = mxGetPr( plhs[oid] );
//           ToOutput3x3;
//           break;

        #define r       eval[0]
        #define e       eval[1]
        #define er      eval[2]
        case EXP:
          r = XX[0] - XX[3];
          r = 4*XX[1]*XX[2] + r*r;
          
          if( r >= 0 ){
            r = sqrt(r);
            
            
            e = exp( ( XX[0] + XX[3] - r )/2 )/r/2.0;
            er = exp(r);
            
            Ok[0] = e * ( XX[3] - XX[0] + r + er*(XX[0]-XX[3]+r) );
            
            Ok[1] = e * XX[1] * ( er - 1 ) * 2;
            
            Ok[2] = e * XX[2] * ( er - 1 ) * 2;
            
            Ok[3] = e * ( XX[0] - XX[3] + r + er*(XX[3]-XX[0]+r) );

          } else {
            
            r = sqrt( -r );
            
            e = exp( ( XX[0] + XX[3] )/2 )/r;
            er = sin(r/2);
            
            Ok[0] = e * ( r*cos(r/2) + ( XX[0]-XX[3] )*er );
            
            Ok[1] = 2 * XX[1] * e * er;
            
            Ok[2] = 2 * XX[2] * e * er;            
            
            Ok[3] = e * ( r*cos(r/2) + ( XX[3]-XX[0] )*er );
            
          }
          
          
          O = mxGetPr( plhs[oid] );
          ToOutput2x2;
          break;

          
          
//         case evalFUN:
//           O = mxGetPr( plhs[oid] ) + k*NN;
//           if( !D_computed     ){ EigenValuesSym3x3( XX , D );       D_computed = 1;      }
//           if( !V_computed     ){ EigenVectorsSym3x3( XX , D , V);   V_computed = 1;      }
// 
//           fD[0] = exp( D[0] );
//           fD[1] = exp( D[1] );
//           fD[2] = exp( D[2] );
// 
//           mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[], const char *name)
//           
//           FillO
//           break;
      
      }
    }
    
  }}}
  
  EXIT: myFreeALLOCATES();
}
Esempio n. 24
0
Integer PairingGroup::RandomExponent() const
{
    return Integer::GetRandomInteger(1, GetOrder(), false);
}