/**CFile****************************************************************

  FileName    [msatActivity.c]

  PackageName [A C version of SAT solver MINISAT, originally developed 
  in C++ by Niklas Een and Niklas Sorensson, Chalmers University of 
  Technology, Sweden: http://www.cs.chalmers.se/~een/Satzoo.]

  Synopsis    [Procedures controlling activity of variables and clauses.]

  Author      [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - January 1, 2004.]

  Revision    [$Id: msatActivity.c,v 1.0 2004/01/01 1:00:00 alanmi Exp $]

***********************************************************************/

#include "msatInt.h"

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Msat_SolverVarBumpActivity( Msat_Solver_t * p, Msat_Lit_t Lit )
{
    Msat_Var_t Var;
    if ( p->dVarDecay < 0 ) // (negative decay means static variable order -- don't bump)
        return;
    Var = MSAT_LIT2VAR(Lit);
    p->pdActivity[Var] += p->dVarInc;
//    p->pdActivity[Var] += p->dVarInc * p->pFactors[Var];
    if ( p->pdActivity[Var] > 1e100 )
        Msat_SolverVarRescaleActivity( p );
    Msat_OrderUpdate( p->pOrder, Var );
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Msat_SolverVarDecayActivity( Msat_Solver_t * p )
{
    if ( p->dVarDecay >= 0 )
        p->dVarInc *= p->dVarDecay;
}

/**Function*************************************************************

  Synopsis    [Divide all variable activities by 1e100.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Msat_SolverVarRescaleActivity( Msat_Solver_t * p )
{
    int i;
    for ( i = 0; i < p->nVars; i++ )
        p->pdActivity[i] *= 1e-100;
    p->dVarInc *= 1e-100;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Msat_SolverClaBumpActivity( Msat_Solver_t * p, Msat_Clause_t * pC )
{
    float Activ;
    Activ = Msat_ClauseReadActivity(pC);
    if ( Activ + p->dClaInc > 1e20 )
    {
        Msat_SolverClaRescaleActivity( p );
        Activ = Msat_ClauseReadActivity( pC );
    }
    Msat_ClauseWriteActivity( pC, Activ + (float)p->dClaInc );
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Msat_SolverClaDecayActivity( Msat_Solver_t * p )
{
    p->dClaInc *= p->dClaDecay;
}

/**Function*************************************************************

  Synopsis    [Divide all constraint activities by 1e20.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Msat_SolverClaRescaleActivity( Msat_Solver_t * p )
{
    Msat_Clause_t ** pLearned;
    int nLearned, i;
    float Activ;
    nLearned = Msat_ClauseVecReadSize( p->vLearned );
    pLearned = Msat_ClauseVecReadArray( p->vLearned );
    for ( i = 0; i < nLearned; i++ )
    {
        Activ = Msat_ClauseReadActivity( pLearned[i] );
        Msat_ClauseWriteActivity( pLearned[i], Activ * (float)1e-20 );
    }
    p->dClaInc *= 1e-20;
}

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


ABC_NAMESPACE_IMPL_END