All Downloads are FREE. Search and download functionalities are using the official Maven repository.

expr.FunF.scala Maven / Gradle / Ivy

package galileo.expr

import galileo.environment.Environment

// Functions of one variable (or expression)
// used in SinF1, LogF1...
trait FunF1 extends Expr {
	val e:Expr
	override def leadingVariable:Option[String] = e.leadingVariable
	def variables:List[Variable] = e.variables
}

// Functions of two variables (or expressions)
// Use in Power, Fraction...
trait FunF2 extends Expr {
	val a:Expr
	val b:Expr
	override def leadingVariable:Option[String] = (a.leadingVariable,b.leadingVariable) match {
		case (Some(r),Some(s)) => Some( List( r, s ).min )
		case (Some(r),_) => Some(r)
		case (_,Some(s)) => Some(s)  
		case _ => None
	}
  def info(env:Option[Environment]=None) = this.getClass.getSimpleName + "(" + a + "," + b + ")"
  def variables:List[Variable] = a.variables ++ b.variables
}

// Functions of any number of variables (or expressions)
// Used by Sum and Product
trait FunMany extends Expr {
 	val elements:List[Expr]
  	
    // Possible variable name 
  	override def leadingVariable:Option[String] = {
    	//val lvs = this.elements.map( element => element.leadingVariable ).filter( pv => pv != None ).map( {case Some( s ) => s })
      val lvs = this.elements.map( element => element.leadingVariable ).filter( pv => pv != None ).map( { 
        case Some( s ) => s
        case _ => ""
      } )
    	lvs.size > 0 match {
      		case true => Some( lvs.min )
      		case false => None
    	}
  	}

	// A generic function that applies pair-wise simplification
	// neutralElement is 0 for Sum, 1 for Product
  	def scan(neutralElement:Expr,terms:List[Expr],scanner:(Expr,Expr)=>Option[Expr]):List[Expr] = {
        // simply loop over all factors and combine if/when possible
        var newTerms:List[Expr] = Nil
        var candidate:Expr = neutralElement
        for( term <- terms ) {
        	scanner(candidate,term ) match {
        		case Some(r) => candidate = r
        		case _ => {
        			//println( "FunMany.scan: scanner(" + candidate + "," + term + "):" + scanner( candidate, term ) )
        			newTerms = newTerms :+ candidate
            	candidate = term  
        		}
        	}
        }
        // add the last one...
        newTerms :+ candidate
    }
  
  // turn an List of Expr into an Expr:
  // * terms become a Sum
  // * factors become a Product
  def expressify(l:List[Expr]):Expr
  //def neutralElement:Number

  def variables:List[Variable] = elements.flatMap( element => element.variables )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy