X-Git-Url: https://svn.cri.mines-paristech.fr/git/Faustine.git/blobdiff_plain/c4ce4ce8d2dff5817b7caa758655465e34456368..4d5f39ea1ae1eff1d8eadf7875851be467e40a47:/interpretor/faustexp.ml?ds=sidebyside

diff --git a/interpretor/faustexp.ml b/interpretor/faustexp.ml
index 6b324a0..684eb75 100644
--- a/interpretor/faustexp.ml
+++ b/interpretor/faustexp.ml
@@ -1,22 +1,83 @@
 (**
  	Module: Faustexp	
-	Description: dimension estimation and delay estimation of faust expressions.
+	Description: Faust expression evaluation
 	@author WANG Haisheng	
-	Created: 03/06/2013	Modified: 04/06/2013
+	Created: 03/06/2013	Modified: 04/08/2013
 *)
 
 open Types;;
 open Value;;
-
+open Signal;;
+open Beam;;
 
 exception NotYetDone;;
-
-
-
-class virtual expression : expression_type = 
+exception Dimension_error of string;;
+
+class dimension : int * int -> dimension_type = 
+  fun (init : int * int) -> 
+    object (self)
+      val dim_input = fst init
+      val dim_output = snd init
+
+      method input = dim_input
+      method output = dim_output
+
+      method par : dimension_type -> dimension_type = 
+	fun dim -> 
+	  new dimension 
+	    ((self#input + dim#input), (self#output + dim#output))
+	    
+      method seq : dimension_type -> dimension_type = 
+	fun dim -> 
+	  if self#output = dim#input then
+	    new dimension (self#input, dim#output)
+	  else raise (Dimension_error "seq dimension not matched.")
+	      
+      method split : dimension_type -> dimension_type =
+	fun dim ->
+	  if dim#input mod self#output = 0 then
+	    new dimension (self#input, dim#output)
+	  else raise (Dimension_error "split dimension not matched.")
+
+      method merge : dimension_type -> dimension_type =
+	fun dim ->
+	  if self#output mod dim#input = 0 then
+	    new dimension (self#input, dim#output)
+	  else raise (Dimension_error "merge dimension not matched.")
+
+      method _rec : dimension_type -> dimension_type = 
+	fun dim ->
+	  if self#output >= dim#input && self#input >= dim#output then
+	    new dimension (self#input - dim#output, self#output)
+	  else raise (Dimension_error "rec dimension not matched.")
+    end;;
+
+class process : faust_exp -> process_type = 
   fun (exp_init : faust_exp) ->
-  object
-      val exp = exp_init
+  object (self)
+    val exp = exp_init
+    val left = 
+      match exp_init with
+      |	Const b -> exp_init
+      |	Ident s -> exp_init
+      |	Par (e1, e2) -> e1
+      |	Seq (e1, e2) -> e1
+      |	Split (e1, e2) -> e1
+      |	Merge (e1, e2) -> e1
+      |	Rec (e1, e2) -> e1
+
+    val right = 
+      match exp_init with
+      |	Const b -> exp_init
+      |	Ident s -> exp_init
+      |	Par (e1, e2) -> e2
+      |	Seq (e1, e2) -> e2
+      |	Split (e1, e2) -> e2
+      |	Merge (e1, e2) -> e2
+      |	Rec (e1, e2) -> e2
+
+    val proc_left = 
+
       val dim = new dimension
       val delay = 0
       method get_exp = exp
@@ -24,12 +85,14 @@ class virtual expression : expression_type =
       method get_delay = delay
       method to_string = "NotYetDone"
       method virtual evaluate : beam_type -> beam_type
-end;;
+  end;;
 
 
-class exp_const = 
-  object
-      inherit expression
+class proc_const : faust_exp -> process_type = 
+  fun (exp_init : faust_exp) ->
+    object (self)
+      val exp = exp_init
+      val dim = 
       method evaluate = fun b1 ->
 	
       end;;
@@ -74,7 +137,7 @@ class exp_rec =
 
       end;;
 
-
+*)
 
 
 
@@ -97,15 +160,15 @@ let rec delay exp_faust = match exp_faust with
 			|Pass			->	0
 			|Stop			->	0
 			|Mem			->	1
-			|Delay			->	100000 (* danger! *)
+			|Delay			->	100000 
 			|Floor		        ->	0
 			|Int			->	0
 			|Sin			->	0
-			|Rdtable		->	100000 (* danger! *)
+			|Rdtable		->	100000
 			|Mod			->	0
 			|Larger			->	0
 			|Smaller		->	0
-			|Vectorize		->	100 (* danger! *)
+			|Vectorize		->	100
 			|Concat			->	0
 			|Nth			->	0
 			|Serialize		->	0
@@ -152,46 +215,6 @@ let subtree_left = fun d_tree -> subtree d_tree 0;;
 (** val subtree_right : dimension -> dimension, returns the right subtree of dimension tree.*)
 let subtree_right = fun d_tree -> subtree d_tree 1;;
 
-
-(** val d_par : int * int -> int * int -> int * int, process dimension for constructor "par(,)", 
-which is the addition of two dimensions.*)
-let d_par a b = (((fst a) + (fst b)), ((snd a) + (snd b)));;
-
-
-(** val d_seq : int * int -> int * int -> int * int, process dimension for constructor "seq(:)", 
-which is (size of input beam of first exp, size of output beam of second exp) 
-along with beam matching.*)
-let d_seq a b = if (snd a) = (fst b) then (fst a, snd b) else raise (Beam_Matching_Error "seq");;
-
-
-(** val d_split : int * int -> int * int -> int * int, process dimension for constructor "split(<:)", 
-which is (size of input beam of first exp, size of output beam of second exp) 
-along with beam matching.*)
-let d_split a b = 
-  if ((fst b) mod (snd a)) = 0 then 
-    (fst a, snd b) 
-  else raise (Beam_Matching_Error "split");;
-
-
-(** val d_merge : int * int -> int * int -> int * int, process dimension for constructor "merge(:>)", 
-which is (size of input beam of first exp, size of output beam of second exp) 
-along with beam matching. *)
-let d_merge a b = 
-  if ((snd a) mod (fst b)) = 0 then 
-    (fst a, snd b) 
-  else raise (Beam_Matching_Error "merge");;
-
-
-(** val d_rec : int * int -> int * int -> int * int, process dimension for constructor "rec(~)", 
-which is (size of input beam of first exp - size of output beam of second exp, 
-size of output beam of first exp) 
-along with beam matching.*)
-let d_rec a b = 
-  if (fst a) >= (snd b) && (snd a) >= (fst b) then 
-    ((fst a) - (snd b), snd a) 
-  else raise (Beam_Matching_Error "rec");;
-
-
 (** val dim : faust_exp -> int * int, returns dimension for faust expression, 
 along with beam matching.*)
 let rec dim exp_faust =