Exemplo n.º 1
0
obj prod(obj v, obj (*func)(obj, obj)){
	obj rr;
	switch(type(v)){
	case LIST:
		assert(!! ul(v));
		rr=retain(first(ul(v)));
		for(list ll=rest(ul(v)); ll; ll=rest(ll)){ 
			obj lt = rr;
			rr = call_fn(func, lt, first(ll));
			release(lt);
		}
		return rr;
	case tLAVec:
	case tDblArray:
	case tDblAr2:
    case tArray:
        {
		int len = size(v);
		if(len==0) return nil;
		rr = ind(v,0);
		for(int i=1; i<len; i++){
			obj lt = rr;
			obj rt = ind(v,i);
			rr = call_fnr(func, lt, rt);
		//	release(lt);
		//	release(rt);
        }
        return rr;
        }
	default:
		error("not defined for that type.");
		return nil;
	}
}
Exemplo n.º 2
0
/*
obj prod_eval0(list l, obj (*func)(obj, obj)){
	obj lt,rt,rr;
	assert(!! l);
	lt = eval(fpp(l));
	rr = lt;
	for(; l; ){
		rt = eval(fpp(l));
		rr = call_fn(func, lt, rt);
		release(lt);
		release(rt);
		lt = rr;
	}
	return rr;
}
*/
obj prod_eval(list l, obj (*func)(obj, obj)){
	assert(!! l);
	obj rr = eval(fpp(l));
	for(; l; ){
		push(rr);
		push(eval(fpp(l)));
		rr = call_fn(func, sp1, sp0);
		release(pop(&is));
		release(pop(&is));
	}
	return rr;
}
Exemplo n.º 3
0
obj applyCS(obj (*func)(obj, obj), obj v1, obj v2){
	assert(!isVec(type(v2)));
	if(isVec(type(v1))){
		int len=size(v1);
		obj rr = aArray(len);
		for(int i=0; i<len; i++){
			obj lt=ind(v1,i);
			uar(rr).v[i] = call_fn(func, lt, v2); 
			release(lt);
		}
		return rr;
	}
	if(type(v1)==LIST){
		list l=phi();
		for(list l1=ul(v1); l1; l1=rest(l1)){
			l = cons(call_fn(func, first(l1), v2), l);
		}
		return List2v(reverse(l));
	}
	assert(0);
	return nil;
}
Exemplo n.º 4
0
obj eval(obj exp){
ev:	assert(!! exp);
    obj rr,lt, rt;
	switch (exp->type) {
	case tInd:
		return doInd(eval(ult(exp)), ul(eval(urt(exp))));
	case LIST:
		return List2v(evalList(ul(exp)));
	case tArray:
		return map_obj(eval, exp);
	case tAnd:
		return prod_eval(ul(exp), mult);
	case MULT:
		return prod_eval(ul(exp), mult);
	case ARITH:
		return prod_eval(ul(exp), add);
	case POW:
		return prod_eval(ul(exp), power);
	case DIVIDE:
		return prod_eval(ul(exp), divide);
	case tRef:
		return retain(uref(exp));
	case tSymbol:
		if( macromode) {
			if(obj rr = search_assoc(car(macro_env), exp)){
				macromode = false;
				// macro lexical scope should be pushed to the stack here
				rr = exec(rr);
				macromode = true;
				return rr;
			}
		}
		return eval_symbol(exp);
	case tMinus:
		lt = eval(uref(exp));
		rr = uMinus(lt);	// releasing
		if(rr) {release(lt); return rr;}
		static obj symumn = Symbol("-");
		rr = udef_op0(symumn, lt);
		if(rr) {release(lt); return rr;}
		error("uMinus: not defined to that type");
	case tReturn:
		if(! uref(exp)) return encap(tSigRet, nil);
		return  encap(tSigRet, eval(uref(exp)));
	case tBreak:
		return retain(exp);
	case CONDITION:
		return evalCond(exp);
	case tOp:
		if(type(ult(exp)) ==tSymbol) {
			lt = search_assoc(curr_interp->types, ult(exp));
			if(lt) return encap((ValueType)vrInt(lt), eval(urt(exp)));}
		lt = eval(ult(exp));
		push(lt);
		switch(lt->type){
		case tCont:
			assert(0);
		case tSpecial:
			rr = ufn(lt)(urt(exp));
			break;
		case tSyntaxLam:
			rr = macro_exec(lt, urt(exp));
			break;
		case tInternalFn:
        case tClosure:
			rt = eval(urt(exp));
			rr = eval_function(lt, rt);
			break;
        default:
			rt = eval(urt(exp));
			rr = call_fn(mult, lt, rt);
			release(rt);
		}
		release(pop(&is));
		return rr;
	case tClosure:
		assert(0);
	case tCurry:
		return eval_curry(exp, em0(exp));
/*		obj vars = Assoc();
		bind_vars(&vars, em0(exp), em2(exp));
		rr = eval_curry(exp, vars);
		release(vars);
		return rr;
*/	case tArrow:
//		return enclose(exp);
/*		if(macromode){
			if(obj rr = search_assoc(car(macro_env), exp)){
			}
		}
*/ 		return render(tClosure, list3(retain(em0(exp)), retain(em1(exp)), retain(env)));
	case tDefine:
		return func_def(em0(exp), em1(exp), em2(exp));
	case tSyntaxDef:
		let(lfind_var(em0(exp)),  render(tSyntaxLam, list3(retain(em1(exp)), retain(em2(exp)), nil)));
		return nil;
	case tExec:
		return exec(exp);
	case tAssign:
		lt = car(exp);
		if(type(lt)==tOp){
			return func_def(ult(lt), urt(lt), cdr(exp));
		} else if(type(lt)==tMinus){
			static obj symumn = Symbol("-");
			return func_def(symumn, uref(lt), cdr(exp));
		} else return do_assign(lt, eval(cdr(exp)));
	case tIf:
		rr = eval(em0(exp));
		if (type(rr) != INT) error("if: Boolean Expected");
		if (vrInt(rr)) {
			rr = em1(exp);
		} else {
			rr = em2(exp);
		}
		return eval(rr);
	case tWhile:
		for(;;) {
			rr = eval(car(exp));
			if (type(rr) != INT) error("while: Boolean expected");
			if(!vrInt(rr)) break;
			rr = exec(cdr(exp));
			if(rr && type(rr)==tSigRet) return rr;
			if(rr && type(rr)==tBreak) {release(rr); break;}
			if(rr) release(rr);
		}
		return nil;
	default:
		return retain(exp);
	}
}
Exemplo n.º 5
0
obj applyCC( obj (*func)(obj, obj), obj v1, obj v2){
	if(type(v1)==LIST && type(v2)==LIST) {
		list l1=ul(v1), l2=ul(v2);
		list l=nil;
		for(; l1 && l2; l1=rest(l1), l2=rest(l2)){
			l= cons(call_fn(func, first(l1), first(l2)), l); 
		}
		if(l1 || l2) error("unmatched num. of elems. in the lists");
		return List2v(reverse(l));
	}
	obj lt,rt;
	if(type(v1)==tDblArray && type(v2)==tDblArray){
		int len = udar(v1).size;
		if(len != udar(v2).size) error("num mismatch");
		obj rr = dblArray(len);
//		obj rr = new dblarr(len);
		double* v = udar(rr).v;
		for(int i=0; i<len; i++){
			lt = Double(udar(v1).v[i]);//íxÇ¢
			rt = Double(udar(v2).v[i]);
			obj rx = call_fnr(func, lt,rt);
		//	release(lt);
		//	release(rt);
			if(type(rx)!=tDouble) error("array: type mismatch");//kore mondai
			v[i] = udbl(rx);
			release(rx);
		}
		return rr;
	}
	if(isVec(type(v1)) && isVec(type(v2))){
		int len=size(v1);
		if(len!=size(v2)) error("num mismatch");
		obj rr = aArray(len);
		for(int i=0; i<len; i++){
			lt = ind(v1,i);
			rt = ind(v2,i);
			uar(rr).v[i] = call_fnr(func, lt, rt); 
		//	release(lt);
		//	release(rt);
		}
		return rr;
	}
	if( type(v1)==LIST && isVec(type(v2))){
		list l=nil, l1=ul(v1);
		int len=size(v2);
		for(int i=0; i<len; i++,l1=rest(l1)){
			if(! l1) error("num mismatch");
			rt = ind(v2,i);
			l = cons(call_fn(func, first(l1), rt), l);
			release(rt);
		}
		return List2v(reverse(l));
	}
	if( isVec(type(v1)) && type(v2)==LIST){
		list l=nil, l2=ul(v2);
		int len=size(v1);
		for(int i=0; i<len; i++,l2=rest(l2)){
			if(! l2) error("num mismatch");
			lt=ind(v1,i);
			l=cons(call_fn(func, lt, first(l2)), l);
			release(lt);
		}
		return List2v(reverse(l));
	}
	error("operation not defined.");
	return nil;
}
Exemplo n.º 6
0
inline obj call_fnr(obj (*func)(obj, obj), obj lt, obj rt){
	obj rr = call_fn(func, lt, rt);
	release(lt);
	release(rt);
	return rr;
}
Exemplo n.º 7
0
  void Interface::innerNormalPhase () {
    Real oldnormc = normc;
    Int fail = 0;
    Int oldAcnt = 0;

    while ( (normc > rho) && (nRest <= maxrest) && (NormalFlag == 0) && (current_time < max_time) ) {

#ifdef VERBOSE
      if (verbosity_level > 1) {
        std::cout << "Going to innerNormalStep: nRest " << nRest << std::endl
                  << std::endl
                  << "|c| = " << normc << std::endl
                  << "rho = " << rho << std::endl
                  << std::endl;
        if ( (nvar < 10) && (ncon < 10) ) {
          std::cout <<  "A = " << std::endl;
          full(*J).print_more ();
          std::cout << "xc = " << std::endl;
          xc->print_more ();
        }
      }
      GDBSTOP ();
#endif
      nRest++;

      call_ccfsg_xc(dciTrue, dciFalse);
      cholesky();
      infeasible_gradient = 1.0;

      innerNormalDirection(infeasible_gradient);
#ifdef ITER_MATLAB
      iter_file << "X(:,size(X,2)+1) = [" << xcx[0] << ";" << xcx[1] << "];" << std::endl;
#endif

#ifdef VERBOSE
      if (verbosity_level > 1) {
        std::cout << "After innerNormalStep" << std::endl;
        std::cout << "|c| = " << normc << std::endl;
        std::cout << "rho = " << rho << std::endl;
        if ( (nvar < 10) && (ncon < 10) ) {
          std::cout << "xc = " << std::endl;
          xc->print_more();
        }
      }
#endif

#ifndef NDEBUG
      checkInfactibility();
#endif

      gavail = dciFalse;

      if (normc > phi2*oldnormc) {
        fail = fail + 1;
      } else
        fail = 0;

      if (fail >= nfailv) {
#ifdef VERBOSE
        if (verbosity_level > 1) {
          std::cout << "Going to Safe Guard " << std::endl
                    << std::endl;
          if ( (nvar < 10) && (ncon < 10) ) {
            std::cout <<  "A = " << std::endl;
            full(*J).print_more ();
          }
          GDBSTOP ();
        }
#endif

        if (normc > 0 && infeasible_gradient/normc < infeasibility_tol)
          NormalFlag = 2;

        if (use_normal_safe_guard && NormalFlag == 0) {
          Vector ssoc(*env, nvar + nconI);
          Real asoc;
          call_ccfsg_xc(dciTrue, dciTrue);
          cholesky();
          StepFlag = naStep (*c, ssoc);
          scale_xc (ssoc);

          // Arrumar tamanho do ssoc a partir do x
          Real alphassoc = 1;
          pReal ssocx = ssoc.get_doublex();
          for (Int i = 0; i < nvar+nconI; i++) {
            Real xi = xcx[i], bli = l_bndx[i], bui = u_bndx[i], di = ssocx[i];
            if (di == 0)
              continue;
            if (di < 0) {
              Real val = (bli - xi)*(1 - epsmu)/di;
                alphassoc = Min (alphassoc, val);
            } else {
              Real val = (bui - xi)*(1 - epsmu)/di;
                alphassoc = Min (alphassoc, val);
            }
          }
          if (alphassoc < 1)
            ssoc.scale (alphassoc);

          asoc = ssoc.norm (0);
          if (asoc > DeltaV)
            xc->saxpy(ssoc, DeltaV/asoc);
          else
            xc->saxpy(ssoc, 1.0);

          call_fn ();
          normc = c->norm ();
        }
        fail = 0;

        if (normal_fail_reboot && normc > rho && NormalFlag == 0) {
          // Has failed but is not infeasible
          Real constr[ncon], funval;
          (*cfn) (&cuter_status, &nvar, &ncon, xcx, &funval, constr);
          Int numI = nvar;
          for (Int i = 0; i < ncon; i++) {
            if (equatn[i] == dciFalse) {
              if (constr[i] > clx[i] && constr[i] < cux[i])
                xcx[numI] = constr[i]/constraint_scaling[i];
              numI++;
            }
          }
          normc = c->norm();
        }
      } else if ( ( (normc > thetaR*oldnormc) && (oldAcnt > 0) ) ||
                  (oldAcnt > 5) ) {
        // Failed. Recompute A

        if (!is_linear) {
          call_ccfsg_xc (dciTrue, dciFalse); //CuterJacob
        }
        Aavail = dciTrue;
        oldAcnt = 0;

        if (!is_linear) {
          this->cholesky ();
        }

      } else {
        oldAcnt++;
        Aavail = dciFalse;
      }

      oldnormc = normc;
      DeltaV = Max (DeltaV, DeltaMin);

      current_time = getTime() - start_time;

    } //Fim do While
  }