⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 affine_func.cc

📁 由matlab开发的hybrid系统的描述语言
💻 CC
字号:
/*	HYSDEL	Copyright (C) 1999-2002  Fabio D. Torrisi	This file is part of HYSDEL.    	HYSDEL is free software; you can redistribute it and/or	modify it under the terms of the GNU General Public	License as published by the Free Software Foundation; either	version 2 of the License, or (at your option) any later version.	HYSDEL is distributed in the hope that it will be useful,	but WITHOUT ANY WARRANTY; without even the implied warranty of	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU	General Public License for more details.	You should have received a copy of the GNU General Public	License along with this library; if not, write to the Free Software	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA	CONTACT INFORMATION	===================	Fabio D. Torrisi	ETH Zentrum	Physikstrasse. 3 ETL,	CH-8032 Zurich	Switzerland	mailto:torrisi@aut.ee.ethz.ch (preferred)*/#include "Affine_func.h"#include "Affine_addend.h"#include "Expr.h"#include "Div_expr.h"#include "Plus_expr.h"#include "Minus_expr.h"#include "Neg_expr.h"#include "Mult_expr.h"#include "Number_expr.h"#include "Var_symbol.h"#include "Real_number.h"Affine_func::Affine_func(const Globals * glob) {	globals = glob;}Affine_func::Affine_func(Expr * c, const Globals * glob) {	Affine_addend * aa;	globals = glob;	assert(c->is_const() && c->is_real()); //fine	aa = new Affine_addend(c, NULL);	addends.push_back(aa);}Affine_func* Affine_func::clone() const{  Affine_func *res;  res=new Affine_func(globals);  for (const_addends_iter iter=addends.begin(); iter!=addends.end(); iter++)    res->addends.push_back( (*iter)->clone() );  return res;}Affine_func::Affine_func(const Var_symbol * var, const Globals * glob) {	Affine_addend * aa;	globals = glob;	aa = new Affine_addend(new Number_expr(1.0, globals), var);	addends.push_back(aa);}Affine_func::~Affine_func() {	for (addends_iter iter = addends.begin(); iter != addends.end();		iter++) {			delete(* iter);	}	addends.clear();}void Affine_func::div_const(Expr * c) {	addends_iter iter;	Expr * div;	assert(c->is_const() && c->is_real()); //fine	for (iter = addends.begin(); iter != addends.end(); iter++) {		div = new Div_expr((* iter)->get_coeff(), c->clone());		(* iter)->set_coeff(div);	}	delete c;}void Affine_func::mult_const(Expr * c) {	addends_iter iter;	Expr * mult;	assert(c->is_const() && c->is_real()); //fine	for (iter = addends.begin(); iter != addends.end(); iter++) {		mult = new Mult_expr(c->clone(), (* iter)->get_coeff());		(* iter)->set_coeff(mult);	}	delete c;}void Affine_func::neg() {	addends_iter iter;	Expr * neg;	for (iter = addends.begin(); iter != addends.end(); iter++) {		neg = new Neg_expr((* iter)->get_coeff());		(* iter)->set_coeff(neg);	}}string Affine_func::to_string() const {	string res;	const_addends_iter iter, tmp;	for (iter = addends.begin(); iter != addends.end(); iter++) {		res += (* iter)->to_string();		tmp = iter;		tmp++;		if (tmp != addends.end()) res += " + ";	}	return res;}void Affine_func::add(Affine_func * add) {	addends_iter iter;	Affine_addend * partner;	Affine_addend * nv;	Expr * e;	for (iter = add->addends.begin(); iter != add->addends.end(); iter++) {		partner = find_addend_nonconst((* iter)->get_var());		if (partner) {			e = new Plus_expr(partner->get_coeff(),				(* iter)->get_coeff());			partner->set_coeff(e);		} else { // -> add new variable			nv = new Affine_addend((* iter)->get_coeff(),				(* iter)->get_var());			addends.push_back(nv);		}	}	add->addends.clear();}void Affine_func::sub(Affine_func * sub) {	sub->neg();	add(sub);}Affine_addend * Affine_func::find_addend_nonconst(const Var_symbol * var) {	addends_iter iter;	for (iter = addends.begin(); iter != addends.end(); iter++) {		if ((* iter)->get_var() == var) return * iter;	}	return NULL;}const Affine_addend * Affine_func::find_addend(const Var_symbol * var) const {	const_addends_iter iter;	for (iter = addends.begin(); iter != addends.end(); iter++) {		if ((* iter)->get_var() == var) return * iter;	}	return NULL;}Affine_addend * Affine_func::remove_const() {	addends_iter iter;	Affine_addend * cnst;	for (iter = addends.begin(); iter != addends.end(); iter++) {		if ((* iter)->get_var() == NULL) {			cnst = * iter;			addends.erase(iter);			return cnst;		}	}	return NULL;}Expr * Affine_func::to_expr() const {	Expr * ret;	const_addends_iter iter;	ret = new Number_expr(0.0, globals); // an empty Expr	for (iter = addends.begin(); iter != addends.end(); iter++) {		ret = new Plus_expr(ret, (* iter)->to_expr());	}	return ret;}void Affine_func::simplify() {	const Expr * c;	for (addends_iter iter = addends.begin(); iter != addends.end(); ) {		(* iter)->simplify();		c = (* iter)->get_coeff();		if (c->is_number() && ((Real_number *)			(c->compute_number()))->is_zero()) {				delete(* iter);				addends.erase(iter);		} else iter++;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -