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

📄 mnemosyne_cost.erl

📁 OTP是开放电信平台的简称
💻 ERL
字号:
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(mnemosyne_cost).-export([output_size/2,	 selective_cost/2]).-include("mnemosyne_internal_form.hrl").%%%================================================================%%% 		Exports%% The average number of tuples that a call of G will returnoutput_size(P, BoundVars) when is_record(P,pred_sym), P#pred_sym.type==table ->    {Card, Image, MaxSel} = mnemosyne_catalog:image(P#pred_sym.functor),    if  MaxSel == 0 -> 0; %% ????	true ->	    selectivity(P#pred_sym.args, BoundVars, Image, P#pred_sym.functor,			1, 1) / MaxSel    end;output_size(P, BoundVars) ->    1.%%%---------------- Cost function(s)%% Cost = f(estimated_selectivity)selective_cost(P, BoundVars) when is_record(P,pred_sym) ->    case P#pred_sym.type of	rule when P#pred_sym.recursive==recursive -> 	    {5, 0, bound_factor(P,BoundVars)};	table -> 	    {3,	     mul_location_factor(P, output_size(P,BoundVars)),	     bound_factor(P,BoundVars)}    end;selective_cost({'#not',C,NGs}, BoundVars) ->    case mnemosyne_unify:variables_and_annonymous(NGs) of	[] -> {4,length(NGs),0};	N ->  {6,length(NGs),length(N)}    end;selective_cost(E, BoundVars) when is_record(E,erl_expr) ->    {1,0,0}.%%%================================================================%%% 		Private%% Fraction of bound variables/orignal num vars.  Range [0..100]bound_factor(P, AllBoundVars) ->    OrigVars = P#pred_sym.original_args_vars,    if  OrigVars==[] -> 	    1;	true ->	    VarsNow = 		mnemosyne_unify:variables_and_annonymous(P#pred_sym.args),	    BoundVars = ordsets:union(ordsets:intersection(VarsNow,							   AllBoundVars),				      ordsets:subtract(OrigVars,VarsNow)),	    100 - ((100*card(BoundVars)) div card(OrigVars))    end.selectivity([A|Args], BoundVars, Image, Tab, Pos, Acc) ->    selectivity(Args, BoundVars, Image, Tab, Pos+1,		case A of		    {'#var','_'} -> Acc;		    {'#var',V} ->			case ordsets:is_element(V,BoundVars) of			    true -> Acc*element(Pos,Image);			    false -> Acc			end;		    _ -> Acc*element(Pos,Image)		end);selectivity([], _, _, _, _, Acc) ->    Acc.mul_location_factor(P, V) ->   case location(P) of       remote -> 100*V;       local -> V   end.location(P) ->    case lists:member(P#pred_sym.functor, 		      mnesia:system_info(local_tables)) of	true -> local;	false -> remote    end.card(S) -> length(ordsets:to_list(S)).

⌨️ 快捷键说明

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