Analysis: enable symbolic analysis of the matrice dimensions 43/16143/3
Calixte DENIZET [Wed, 11 Mar 2015 16:05:44 +0000 (17:05 +0100)]
Change-Id: Ic4ab553328cf0a116747043662b8c46fb353f3b1

149 files changed:
scilab/modules/ast/Makefile.am
scilab/modules/ast/Makefile.in
scilab/modules/ast/ast.vcxproj
scilab/modules/ast/ast.vcxproj.filters
scilab/modules/ast/includes/analysis/AnalysisVisitor.hxx
scilab/modules/ast/includes/analysis/Call.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/Checkers.hxx [deleted file]
scilab/modules/ast/includes/analysis/Chrono.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/Decorator.hxx
scilab/modules/ast/includes/analysis/ForList.hxx
scilab/modules/ast/includes/analysis/Result.hxx
scilab/modules/ast/includes/analysis/TIType.hxx
scilab/modules/ast/includes/analysis/Temporary.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/AddAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/Analyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/ArgnAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/CallAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/CeilAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/DiagAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/LengthAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/MatrixAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/MemInitAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/SizeAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/calls/SqrtAnalyzer.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/Checkers.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_abs.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_acos.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_add.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_asin.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_atan.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_ceil.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_cos.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_cosh.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_cumprod.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_cumsum.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_dothypot.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_dotrdiv.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_dottimes.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_dottransp.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_erf.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_erfc.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_exp.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_fix.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_floor.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_hypot.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_int.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_int16.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_int32.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_int64.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_int8.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_isinf.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_isnan.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_krontimes.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_log.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_max.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_min.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_ones.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_prod.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_rand.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_round.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_sin.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_sinh.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_sinm.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_sqrt.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_sub.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_subt.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_sum.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_tan.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_tanh.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_times.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_transp.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_uint16.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_uint32.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_uint64.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_uint8.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/checkers/check_zeros.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/Block.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/CompleteMacroSignature.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/Data.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/DataManager.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/FunctionBlock.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/GlobalsCollector.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/Info.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/LoopBlock.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/MacroCache.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/MacroDef.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/MacroInfo.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/MacroSignature.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/PolymorphicMacroCache.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/TITypeSignatureTuple.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/TITypeTuple.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/data/XBlock.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/gvn/ConstraintManager.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/gvn/GVN.hxx
scilab/modules/ast/includes/analysis/gvn/InferenceConstraint.hxx
scilab/modules/ast/includes/analysis/gvn/OpValue.hxx
scilab/modules/ast/includes/analysis/gvn/SymbolicDimension.hxx
scilab/modules/ast/includes/analysis/gvn/SymbolicRange.hxx
scilab/modules/ast/includes/analysis/gvn/TestGVNVisitor.hxx
scilab/modules/ast/includes/analysis/positivity/PositivityVisitor.hxx [new file with mode: 0644]
scilab/modules/ast/includes/analysis/tools.hxx
scilab/modules/ast/includes/ast/dummyvisitor.hxx
scilab/modules/ast/includes/ast/serializervisitor.hxx
scilab/modules/ast/includes/exps/arraylistvar.hxx
scilab/modules/ast/includes/exps/callexp.hxx
scilab/modules/ast/includes/exps/functiondec.hxx
scilab/modules/ast/includes/exps/listexp.hxx
scilab/modules/ast/includes/exps/opexp.hxx
scilab/modules/ast/includes/exps/selectexp.hxx
scilab/modules/ast/src/cpp/analysis/AnalysisVisitor.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/ArgnAnalyzer.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/Block.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/Checkers.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/CompleteMacroSignature.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/ConstraintManager.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/DiagAnalyzer.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/FunctionBlock.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/InferenceConstraints.cpp
scilab/modules/ast/src/cpp/analysis/LengthAnalyzer.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/LoopBlock.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/MacroDef.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/MatrixAnalyzer.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/MemInitAnalyzer.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/PolymorphicMacroCache.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/SizeAnalyzer.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/VisitListExp.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/VisitMatrixExp.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/analysis/XBlock.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/ast/debugvisitor.cpp
scilab/modules/ast/src/cpp/ast/macrovarvisitor.cpp
scilab/modules/ast/src/cpp/ast/mutevisitor.cpp
scilab/modules/ast/src/cpp/ast/printvisitor.cpp
scilab/modules/ast/src/cpp/ast/run_CallExp.hpp
scilab/modules/ast/src/cpp/ast/run_OpExp.hpp
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/src/cpp/ast/treevisitor.cpp
scilab/modules/ast/src/cpp/ast/visitor_common.cpp
scilab/modules/ast/tests/unit_tests/analysis1.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/analysis1.tst [new file with mode: 0644]
scilab/modules/core/src/cpp/tasks.cpp
scilab/modules/fftw/src/nofftw/nofftw.vcxproj
scilab/modules/functions/Makefile.am
scilab/modules/functions/Makefile.in
scilab/modules/functions/includes/functions_gw.hxx
scilab/modules/functions/sci_gateway/cpp/functions_gw.vcxproj
scilab/modules/functions/sci_gateway/cpp/functions_gw.vcxproj.filters
scilab/modules/functions/sci_gateway/cpp/sci_execstr.cpp
scilab/modules/functions/sci_gateway/cpp/sci_testAnalysis.cpp [new file with mode: 0644]
scilab/modules/functions/sci_gateway/functions_gateway.xml

index e77cf32..f7242ed 100644 (file)
@@ -101,7 +101,25 @@ src/cpp/types/tostring_common.cpp \
 src/cpp/types/types.cpp \
 src/cpp/types/types_tools.cpp \
 src/cpp/types/void.cpp \
-src/cpp/analysis/InferenceConstraints.cpp
+src/cpp/analysis/AnalysisVisitor.cpp \
+src/cpp/analysis/ArgnAnalyzer.cpp \
+src/cpp/analysis/Block.cpp \
+src/cpp/analysis/Checkers.cpp \
+src/cpp/analysis/CompleteMacroSignature.cpp \
+src/cpp/analysis/ConstraintManager.cpp \
+src/cpp/analysis/DiagAnalyzer.cpp \
+src/cpp/analysis/FunctionBlock.cpp \
+src/cpp/analysis/InferenceConstraints.cpp \
+src/cpp/analysis/LengthAnalyzer.cpp \
+src/cpp/analysis/LoopBlock.cpp \
+src/cpp/analysis/MacroDef.cpp \
+src/cpp/analysis/MatrixAnalyzer.cpp \
+src/cpp/analysis/MemInitAnalyzer.cpp \
+src/cpp/analysis/PolymorphicMacroCache.cpp \
+src/cpp/analysis/SizeAnalyzer.cpp \
+src/cpp/analysis/VisitListExp.cpp \
+src/cpp/analysis/VisitMatrixExp.cpp \
+src/cpp/analysis/XBlock.cpp
 
 if ENABLE_DEBUG
 libsciast_la_SOURCES += src/cpp/types/inspector.cpp
@@ -152,7 +170,7 @@ libsciast_la_etc_DATA = \
 libsciast_scilab_la_includedir=$(pkgincludedir)
 libsciast_scilab_la_include_HEADERS = \
 includes/analysis/AnalysisVisitor.hxx \
-includes/analysis/Checkers.hxx \
+includes/analysis/checkers/Checkers.hxx \
 includes/analysis/Decorator.hxx \
 includes/analysis/ForList.hxx \
 includes/analysis/Result.hxx \
index 9da7394..6d5dcf7 100644 (file)
@@ -223,8 +223,23 @@ am__libsciast_la_SOURCES_DIST = src/c/operations/doublecomplex.c \
        src/cpp/types/threadId.cpp src/cpp/types/tlist.cpp \
        src/cpp/types/tostring_common.cpp src/cpp/types/types.cpp \
        src/cpp/types/types_tools.cpp src/cpp/types/void.cpp \
+       src/cpp/analysis/AnalysisVisitor.cpp \
+       src/cpp/analysis/ArgnAnalyzer.cpp src/cpp/analysis/Block.cpp \
+       src/cpp/analysis/Checkers.cpp \
+       src/cpp/analysis/CompleteMacroSignature.cpp \
+       src/cpp/analysis/ConstraintManager.cpp \
+       src/cpp/analysis/DiagAnalyzer.cpp \
+       src/cpp/analysis/FunctionBlock.cpp \
        src/cpp/analysis/InferenceConstraints.cpp \
-       src/cpp/types/inspector.cpp
+       src/cpp/analysis/LengthAnalyzer.cpp \
+       src/cpp/analysis/LoopBlock.cpp src/cpp/analysis/MacroDef.cpp \
+       src/cpp/analysis/MatrixAnalyzer.cpp \
+       src/cpp/analysis/MemInitAnalyzer.cpp \
+       src/cpp/analysis/PolymorphicMacroCache.cpp \
+       src/cpp/analysis/SizeAnalyzer.cpp \
+       src/cpp/analysis/VisitListExp.cpp \
+       src/cpp/analysis/VisitMatrixExp.cpp \
+       src/cpp/analysis/XBlock.cpp src/cpp/types/inspector.cpp
 am__dirstamp = $(am__leading_dot)dirstamp
 @ENABLE_DEBUG_TRUE@am__objects_1 =  \
 @ENABLE_DEBUG_TRUE@    src/cpp/types/libsciast_la-inspector.lo
@@ -316,8 +331,25 @@ am_libsciast_la_OBJECTS =  \
        src/cpp/types/libsciast_la-types.lo \
        src/cpp/types/libsciast_la-types_tools.lo \
        src/cpp/types/libsciast_la-void.lo \
+       src/cpp/analysis/libsciast_la-AnalysisVisitor.lo \
+       src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo \
+       src/cpp/analysis/libsciast_la-Block.lo \
+       src/cpp/analysis/libsciast_la-Checkers.lo \
+       src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo \
+       src/cpp/analysis/libsciast_la-ConstraintManager.lo \
+       src/cpp/analysis/libsciast_la-DiagAnalyzer.lo \
+       src/cpp/analysis/libsciast_la-FunctionBlock.lo \
        src/cpp/analysis/libsciast_la-InferenceConstraints.lo \
-       $(am__objects_1)
+       src/cpp/analysis/libsciast_la-LengthAnalyzer.lo \
+       src/cpp/analysis/libsciast_la-LoopBlock.lo \
+       src/cpp/analysis/libsciast_la-MacroDef.lo \
+       src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo \
+       src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo \
+       src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo \
+       src/cpp/analysis/libsciast_la-SizeAnalyzer.lo \
+       src/cpp/analysis/libsciast_la-VisitListExp.lo \
+       src/cpp/analysis/libsciast_la-VisitMatrixExp.lo \
+       src/cpp/analysis/libsciast_la-XBlock.lo $(am__objects_1)
 libsciast_la_OBJECTS = $(am_libsciast_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -752,7 +784,23 @@ libsciast_la_SOURCES = src/c/operations/doublecomplex.c \
        src/cpp/types/threadId.cpp src/cpp/types/tlist.cpp \
        src/cpp/types/tostring_common.cpp src/cpp/types/types.cpp \
        src/cpp/types/types_tools.cpp src/cpp/types/void.cpp \
-       src/cpp/analysis/InferenceConstraints.cpp $(am__append_1)
+       src/cpp/analysis/AnalysisVisitor.cpp \
+       src/cpp/analysis/ArgnAnalyzer.cpp src/cpp/analysis/Block.cpp \
+       src/cpp/analysis/Checkers.cpp \
+       src/cpp/analysis/CompleteMacroSignature.cpp \
+       src/cpp/analysis/ConstraintManager.cpp \
+       src/cpp/analysis/DiagAnalyzer.cpp \
+       src/cpp/analysis/FunctionBlock.cpp \
+       src/cpp/analysis/InferenceConstraints.cpp \
+       src/cpp/analysis/LengthAnalyzer.cpp \
+       src/cpp/analysis/LoopBlock.cpp src/cpp/analysis/MacroDef.cpp \
+       src/cpp/analysis/MatrixAnalyzer.cpp \
+       src/cpp/analysis/MemInitAnalyzer.cpp \
+       src/cpp/analysis/PolymorphicMacroCache.cpp \
+       src/cpp/analysis/SizeAnalyzer.cpp \
+       src/cpp/analysis/VisitListExp.cpp \
+       src/cpp/analysis/VisitMatrixExp.cpp \
+       src/cpp/analysis/XBlock.cpp $(am__append_1)
 libsciast_la_CPPFLAGS = \
        -I$(srcdir)/includes/ast \
        -I$(srcdir)/includes/exps \
@@ -795,7 +843,7 @@ libsciast_la_etc_DATA = \
 libsciast_scilab_la_includedir = $(pkgincludedir)
 libsciast_scilab_la_include_HEADERS = \
 includes/analysis/AnalysisVisitor.hxx \
-includes/analysis/Checkers.hxx \
+includes/analysis/checkers/Checkers.hxx \
 includes/analysis/Decorator.hxx \
 includes/analysis/ForList.hxx \
 includes/analysis/Result.hxx \
@@ -1409,9 +1457,63 @@ src/cpp/analysis/$(am__dirstamp):
 src/cpp/analysis/$(DEPDIR)/$(am__dirstamp):
        @$(MKDIR_P) src/cpp/analysis/$(DEPDIR)
        @: > src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-AnalysisVisitor.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-Block.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-Checkers.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-ConstraintManager.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-DiagAnalyzer.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-FunctionBlock.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
 src/cpp/analysis/libsciast_la-InferenceConstraints.lo:  \
        src/cpp/analysis/$(am__dirstamp) \
        src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-LengthAnalyzer.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-LoopBlock.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-MacroDef.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-SizeAnalyzer.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-VisitListExp.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-VisitMatrixExp.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
+src/cpp/analysis/libsciast_la-XBlock.lo:  \
+       src/cpp/analysis/$(am__dirstamp) \
+       src/cpp/analysis/$(DEPDIR)/$(am__dirstamp)
 src/cpp/types/libsciast_la-inspector.lo:  \
        src/cpp/types/$(am__dirstamp) \
        src/cpp/types/$(DEPDIR)/$(am__dirstamp)
@@ -1451,7 +1553,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_power.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_transpose.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-operations_tools.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-AnalysisVisitor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-ArgnAnalyzer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-Block.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-Checkers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-CompleteMacroSignature.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-ConstraintManager.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-DiagAnalyzer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-FunctionBlock.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-InferenceConstraints.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-LengthAnalyzer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-LoopBlock.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-MacroDef.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-MatrixAnalyzer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-MemInitAnalyzer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-PolymorphicMacroCache.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-SizeAnalyzer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitListExp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitMatrixExp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/analysis/$(DEPDIR)/libsciast_la-XBlock.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/ast/$(DEPDIR)/libsciast_la-debugvisitor.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/ast/$(DEPDIR)/libsciast_la-expHistory.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/ast/$(DEPDIR)/libsciast_la-macrovarvisitor.Plo@am__quote@
@@ -2188,6 +2308,62 @@ src/cpp/types/libsciast_la-void.lo: src/cpp/types/void.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/types/libsciast_la-void.lo `test -f 'src/cpp/types/void.cpp' || echo '$(srcdir)/'`src/cpp/types/void.cpp
 
+src/cpp/analysis/libsciast_la-AnalysisVisitor.lo: src/cpp/analysis/AnalysisVisitor.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-AnalysisVisitor.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-AnalysisVisitor.Tpo -c -o src/cpp/analysis/libsciast_la-AnalysisVisitor.lo `test -f 'src/cpp/analysis/AnalysisVisitor.cpp' || echo '$(srcdir)/'`src/cpp/analysis/AnalysisVisitor.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-AnalysisVisitor.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-AnalysisVisitor.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/AnalysisVisitor.cpp' object='src/cpp/analysis/libsciast_la-AnalysisVisitor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-AnalysisVisitor.lo `test -f 'src/cpp/analysis/AnalysisVisitor.cpp' || echo '$(srcdir)/'`src/cpp/analysis/AnalysisVisitor.cpp
+
+src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo: src/cpp/analysis/ArgnAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-ArgnAnalyzer.Tpo -c -o src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo `test -f 'src/cpp/analysis/ArgnAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/ArgnAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-ArgnAnalyzer.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-ArgnAnalyzer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/ArgnAnalyzer.cpp' object='src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-ArgnAnalyzer.lo `test -f 'src/cpp/analysis/ArgnAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/ArgnAnalyzer.cpp
+
+src/cpp/analysis/libsciast_la-Block.lo: src/cpp/analysis/Block.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-Block.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-Block.Tpo -c -o src/cpp/analysis/libsciast_la-Block.lo `test -f 'src/cpp/analysis/Block.cpp' || echo '$(srcdir)/'`src/cpp/analysis/Block.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-Block.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-Block.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/Block.cpp' object='src/cpp/analysis/libsciast_la-Block.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-Block.lo `test -f 'src/cpp/analysis/Block.cpp' || echo '$(srcdir)/'`src/cpp/analysis/Block.cpp
+
+src/cpp/analysis/libsciast_la-Checkers.lo: src/cpp/analysis/Checkers.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-Checkers.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-Checkers.Tpo -c -o src/cpp/analysis/libsciast_la-Checkers.lo `test -f 'src/cpp/analysis/Checkers.cpp' || echo '$(srcdir)/'`src/cpp/analysis/Checkers.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-Checkers.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-Checkers.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/Checkers.cpp' object='src/cpp/analysis/libsciast_la-Checkers.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-Checkers.lo `test -f 'src/cpp/analysis/Checkers.cpp' || echo '$(srcdir)/'`src/cpp/analysis/Checkers.cpp
+
+src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo: src/cpp/analysis/CompleteMacroSignature.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-CompleteMacroSignature.Tpo -c -o src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo `test -f 'src/cpp/analysis/CompleteMacroSignature.cpp' || echo '$(srcdir)/'`src/cpp/analysis/CompleteMacroSignature.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-CompleteMacroSignature.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-CompleteMacroSignature.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/CompleteMacroSignature.cpp' object='src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-CompleteMacroSignature.lo `test -f 'src/cpp/analysis/CompleteMacroSignature.cpp' || echo '$(srcdir)/'`src/cpp/analysis/CompleteMacroSignature.cpp
+
+src/cpp/analysis/libsciast_la-ConstraintManager.lo: src/cpp/analysis/ConstraintManager.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-ConstraintManager.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-ConstraintManager.Tpo -c -o src/cpp/analysis/libsciast_la-ConstraintManager.lo `test -f 'src/cpp/analysis/ConstraintManager.cpp' || echo '$(srcdir)/'`src/cpp/analysis/ConstraintManager.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-ConstraintManager.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-ConstraintManager.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/ConstraintManager.cpp' object='src/cpp/analysis/libsciast_la-ConstraintManager.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-ConstraintManager.lo `test -f 'src/cpp/analysis/ConstraintManager.cpp' || echo '$(srcdir)/'`src/cpp/analysis/ConstraintManager.cpp
+
+src/cpp/analysis/libsciast_la-DiagAnalyzer.lo: src/cpp/analysis/DiagAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-DiagAnalyzer.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-DiagAnalyzer.Tpo -c -o src/cpp/analysis/libsciast_la-DiagAnalyzer.lo `test -f 'src/cpp/analysis/DiagAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/DiagAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-DiagAnalyzer.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-DiagAnalyzer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/DiagAnalyzer.cpp' object='src/cpp/analysis/libsciast_la-DiagAnalyzer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-DiagAnalyzer.lo `test -f 'src/cpp/analysis/DiagAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/DiagAnalyzer.cpp
+
+src/cpp/analysis/libsciast_la-FunctionBlock.lo: src/cpp/analysis/FunctionBlock.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-FunctionBlock.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-FunctionBlock.Tpo -c -o src/cpp/analysis/libsciast_la-FunctionBlock.lo `test -f 'src/cpp/analysis/FunctionBlock.cpp' || echo '$(srcdir)/'`src/cpp/analysis/FunctionBlock.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-FunctionBlock.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-FunctionBlock.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/FunctionBlock.cpp' object='src/cpp/analysis/libsciast_la-FunctionBlock.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-FunctionBlock.lo `test -f 'src/cpp/analysis/FunctionBlock.cpp' || echo '$(srcdir)/'`src/cpp/analysis/FunctionBlock.cpp
+
 src/cpp/analysis/libsciast_la-InferenceConstraints.lo: src/cpp/analysis/InferenceConstraints.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-InferenceConstraints.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-InferenceConstraints.Tpo -c -o src/cpp/analysis/libsciast_la-InferenceConstraints.lo `test -f 'src/cpp/analysis/InferenceConstraints.cpp' || echo '$(srcdir)/'`src/cpp/analysis/InferenceConstraints.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-InferenceConstraints.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-InferenceConstraints.Plo
@@ -2195,6 +2371,76 @@ src/cpp/analysis/libsciast_la-InferenceConstraints.lo: src/cpp/analysis/Inferenc
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-InferenceConstraints.lo `test -f 'src/cpp/analysis/InferenceConstraints.cpp' || echo '$(srcdir)/'`src/cpp/analysis/InferenceConstraints.cpp
 
+src/cpp/analysis/libsciast_la-LengthAnalyzer.lo: src/cpp/analysis/LengthAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-LengthAnalyzer.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-LengthAnalyzer.Tpo -c -o src/cpp/analysis/libsciast_la-LengthAnalyzer.lo `test -f 'src/cpp/analysis/LengthAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/LengthAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-LengthAnalyzer.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-LengthAnalyzer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/LengthAnalyzer.cpp' object='src/cpp/analysis/libsciast_la-LengthAnalyzer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-LengthAnalyzer.lo `test -f 'src/cpp/analysis/LengthAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/LengthAnalyzer.cpp
+
+src/cpp/analysis/libsciast_la-LoopBlock.lo: src/cpp/analysis/LoopBlock.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-LoopBlock.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-LoopBlock.Tpo -c -o src/cpp/analysis/libsciast_la-LoopBlock.lo `test -f 'src/cpp/analysis/LoopBlock.cpp' || echo '$(srcdir)/'`src/cpp/analysis/LoopBlock.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-LoopBlock.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-LoopBlock.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/LoopBlock.cpp' object='src/cpp/analysis/libsciast_la-LoopBlock.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-LoopBlock.lo `test -f 'src/cpp/analysis/LoopBlock.cpp' || echo '$(srcdir)/'`src/cpp/analysis/LoopBlock.cpp
+
+src/cpp/analysis/libsciast_la-MacroDef.lo: src/cpp/analysis/MacroDef.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-MacroDef.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-MacroDef.Tpo -c -o src/cpp/analysis/libsciast_la-MacroDef.lo `test -f 'src/cpp/analysis/MacroDef.cpp' || echo '$(srcdir)/'`src/cpp/analysis/MacroDef.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-MacroDef.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-MacroDef.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/MacroDef.cpp' object='src/cpp/analysis/libsciast_la-MacroDef.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-MacroDef.lo `test -f 'src/cpp/analysis/MacroDef.cpp' || echo '$(srcdir)/'`src/cpp/analysis/MacroDef.cpp
+
+src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo: src/cpp/analysis/MatrixAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-MatrixAnalyzer.Tpo -c -o src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo `test -f 'src/cpp/analysis/MatrixAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/MatrixAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-MatrixAnalyzer.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-MatrixAnalyzer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/MatrixAnalyzer.cpp' object='src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-MatrixAnalyzer.lo `test -f 'src/cpp/analysis/MatrixAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/MatrixAnalyzer.cpp
+
+src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo: src/cpp/analysis/MemInitAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-MemInitAnalyzer.Tpo -c -o src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo `test -f 'src/cpp/analysis/MemInitAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/MemInitAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-MemInitAnalyzer.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-MemInitAnalyzer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/MemInitAnalyzer.cpp' object='src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-MemInitAnalyzer.lo `test -f 'src/cpp/analysis/MemInitAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/MemInitAnalyzer.cpp
+
+src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo: src/cpp/analysis/PolymorphicMacroCache.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-PolymorphicMacroCache.Tpo -c -o src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo `test -f 'src/cpp/analysis/PolymorphicMacroCache.cpp' || echo '$(srcdir)/'`src/cpp/analysis/PolymorphicMacroCache.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-PolymorphicMacroCache.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-PolymorphicMacroCache.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/PolymorphicMacroCache.cpp' object='src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-PolymorphicMacroCache.lo `test -f 'src/cpp/analysis/PolymorphicMacroCache.cpp' || echo '$(srcdir)/'`src/cpp/analysis/PolymorphicMacroCache.cpp
+
+src/cpp/analysis/libsciast_la-SizeAnalyzer.lo: src/cpp/analysis/SizeAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-SizeAnalyzer.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-SizeAnalyzer.Tpo -c -o src/cpp/analysis/libsciast_la-SizeAnalyzer.lo `test -f 'src/cpp/analysis/SizeAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/SizeAnalyzer.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-SizeAnalyzer.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-SizeAnalyzer.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/SizeAnalyzer.cpp' object='src/cpp/analysis/libsciast_la-SizeAnalyzer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-SizeAnalyzer.lo `test -f 'src/cpp/analysis/SizeAnalyzer.cpp' || echo '$(srcdir)/'`src/cpp/analysis/SizeAnalyzer.cpp
+
+src/cpp/analysis/libsciast_la-VisitListExp.lo: src/cpp/analysis/VisitListExp.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-VisitListExp.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitListExp.Tpo -c -o src/cpp/analysis/libsciast_la-VisitListExp.lo `test -f 'src/cpp/analysis/VisitListExp.cpp' || echo '$(srcdir)/'`src/cpp/analysis/VisitListExp.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitListExp.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitListExp.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/VisitListExp.cpp' object='src/cpp/analysis/libsciast_la-VisitListExp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-VisitListExp.lo `test -f 'src/cpp/analysis/VisitListExp.cpp' || echo '$(srcdir)/'`src/cpp/analysis/VisitListExp.cpp
+
+src/cpp/analysis/libsciast_la-VisitMatrixExp.lo: src/cpp/analysis/VisitMatrixExp.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-VisitMatrixExp.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitMatrixExp.Tpo -c -o src/cpp/analysis/libsciast_la-VisitMatrixExp.lo `test -f 'src/cpp/analysis/VisitMatrixExp.cpp' || echo '$(srcdir)/'`src/cpp/analysis/VisitMatrixExp.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitMatrixExp.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-VisitMatrixExp.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/VisitMatrixExp.cpp' object='src/cpp/analysis/libsciast_la-VisitMatrixExp.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-VisitMatrixExp.lo `test -f 'src/cpp/analysis/VisitMatrixExp.cpp' || echo '$(srcdir)/'`src/cpp/analysis/VisitMatrixExp.cpp
+
+src/cpp/analysis/libsciast_la-XBlock.lo: src/cpp/analysis/XBlock.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/analysis/libsciast_la-XBlock.lo -MD -MP -MF src/cpp/analysis/$(DEPDIR)/libsciast_la-XBlock.Tpo -c -o src/cpp/analysis/libsciast_la-XBlock.lo `test -f 'src/cpp/analysis/XBlock.cpp' || echo '$(srcdir)/'`src/cpp/analysis/XBlock.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/analysis/$(DEPDIR)/libsciast_la-XBlock.Tpo src/cpp/analysis/$(DEPDIR)/libsciast_la-XBlock.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/analysis/XBlock.cpp' object='src/cpp/analysis/libsciast_la-XBlock.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/analysis/libsciast_la-XBlock.lo `test -f 'src/cpp/analysis/XBlock.cpp' || echo '$(srcdir)/'`src/cpp/analysis/XBlock.cpp
+
 src/cpp/types/libsciast_la-inspector.lo: src/cpp/types/inspector.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/types/libsciast_la-inspector.lo -MD -MP -MF src/cpp/types/$(DEPDIR)/libsciast_la-inspector.Tpo -c -o src/cpp/types/libsciast_la-inspector.lo `test -f 'src/cpp/types/inspector.cpp' || echo '$(srcdir)/'`src/cpp/types/inspector.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/types/$(DEPDIR)/libsciast_la-inspector.Tpo src/cpp/types/$(DEPDIR)/libsciast_la-inspector.Plo
index 8717384..e0a419c 100644 (file)
@@ -259,7 +259,87 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="includes\analysis\AnalysisVisitor.hxx" />
-    <ClInclude Include="includes\analysis\Checkers.hxx" />
+    <ClInclude Include="includes\analysis\Call.hxx" />
+    <ClInclude Include="includes\analysis\calls\AddAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\Analyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\ArgnAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\CallAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\CeilAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\DiagAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\LengthAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\MatrixAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\MemInitAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\SizeAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\calls\SqrtAnalyzer.hxx" />
+    <ClInclude Include="includes\analysis\checkers\Checkers.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_abs.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_acos.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_add.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_asin.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_atan.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_ceil.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_cos.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_cosh.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_cumprod.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_cumsum.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_dothypot.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_dotrdiv.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_dottimes.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_dottransp.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_erf.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_erfc.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_exp.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_fix.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_floor.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_hypot.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_int.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_int16.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_int32.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_int64.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_int8.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_isinf.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_isnan.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_krontimes.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_log.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_max.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_min.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_ones.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_prod.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_rand.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_round.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_sin.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_sinh.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_sinm.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_sqrt.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_sub.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_subt.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_sum.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_tan.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_tanh.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_times.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_transp.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_uint16.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_uint32.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_uint64.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_uint8.hxx" />
+    <ClInclude Include="includes\analysis\checkers\check_zeros.hxx" />
+    <ClInclude Include="includes\analysis\Chrono.hxx" />
+    <ClInclude Include="includes\analysis\data\Block.hxx" />
+    <ClInclude Include="includes\analysis\data\CompleteMacroSignature.hxx" />
+    <ClInclude Include="includes\analysis\data\Data.hxx" />
+    <ClInclude Include="includes\analysis\data\DataManager.hxx" />
+    <ClInclude Include="includes\analysis\data\FunctionBlock.hxx" />
+    <ClInclude Include="includes\analysis\data\GlobalsCollector.hxx" />
+    <ClInclude Include="includes\analysis\data\Info.hxx" />
+    <ClInclude Include="includes\analysis\data\LoopBlock.hxx" />
+    <ClInclude Include="includes\analysis\data\MacroCache.hxx" />
+    <ClInclude Include="includes\analysis\data\MacroDef.hxx" />
+    <ClInclude Include="includes\analysis\data\MacroInfo.hxx" />
+    <ClInclude Include="includes\analysis\data\MacroSignature.hxx" />
+    <ClInclude Include="includes\analysis\data\PolymorphicMacroCache.hxx" />
+    <ClInclude Include="includes\analysis\data\TITypeSignatureTuple.hxx" />
+    <ClInclude Include="includes\analysis\data\TITypeTuple.hxx" />
+    <ClInclude Include="includes\analysis\data\XBlock.hxx" />
     <ClInclude Include="includes\analysis\Decorator.hxx" />
     <ClInclude Include="includes\analysis\ForList.hxx" />
     <ClInclude Include="includes\analysis\gvn\GVN.hxx" />
@@ -271,8 +351,10 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClInclude Include="includes\analysis\gvn\SymbolicRange.hxx" />
     <ClInclude Include="includes\analysis\gvn\TestGVNVisitor.hxx" />
     <ClInclude Include="includes\analysis\gvn\VarExp.hxx" />
+    <ClInclude Include="includes\analysis\positivity\PositivityVisitor.hxx" />
     <ClInclude Include="includes\analysis\Result.hxx" />
     <ClInclude Include="includes\analysis\SymInfo.hxx" />
+    <ClInclude Include="includes\analysis\Temporary.hxx" />
     <ClInclude Include="includes\analysis\TIType.hxx" />
     <ClInclude Include="includes\analysis\tools.hxx" />
     <ClInclude Include="includes\ast\debugvisitor.hxx" />
@@ -449,7 +531,25 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClInclude Include="src\cpp\ast\run_OpExp.hpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="src\cpp\analysis\AnalysisVisitor.cpp" />
+    <ClCompile Include="src\cpp\analysis\ArgnAnalyzer.cpp" />
+    <ClCompile Include="src\cpp\analysis\Block.cpp" />
+    <ClCompile Include="src\cpp\analysis\Checkers.cpp" />
+    <ClCompile Include="src\cpp\analysis\CompleteMacroSignature.cpp" />
+    <ClCompile Include="src\cpp\analysis\ConstraintManager.cpp" />
+    <ClCompile Include="src\cpp\analysis\DiagAnalyzer.cpp" />
+    <ClCompile Include="src\cpp\analysis\FunctionBlock.cpp" />
     <ClCompile Include="src\cpp\analysis\InferenceConstraints.cpp" />
+    <ClCompile Include="src\cpp\analysis\LengthAnalyzer.cpp" />
+    <ClCompile Include="src\cpp\analysis\LoopBlock.cpp" />
+    <ClCompile Include="src\cpp\analysis\MacroDef.cpp" />
+    <ClCompile Include="src\cpp\analysis\MatrixAnalyzer.cpp" />
+    <ClCompile Include="src\cpp\analysis\MemInitAnalyzer.cpp" />
+    <ClCompile Include="src\cpp\analysis\PolymorphicMacroCache.cpp" />
+    <ClCompile Include="src\cpp\analysis\SizeAnalyzer.cpp" />
+    <ClCompile Include="src\cpp\analysis\VisitListExp.cpp" />
+    <ClCompile Include="src\cpp\analysis\VisitMatrixExp.cpp" />
+    <ClCompile Include="src\cpp\analysis\XBlock.cpp" />
     <ClCompile Include="src\cpp\ast\debugvisitor.cpp" />
     <ClCompile Include="src\cpp\ast\expHistory.cpp" />
     <ClCompile Include="src\cpp\ast\treevisitor.cpp" />
index 4a0df85..b12a6ff 100644 (file)
     <Filter Include="Source Files\ast\analysis">
       <UniqueIdentifier>{d2899833-14f7-4af4-8054-128d479c51c7}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Header Files\analysis\checkers">
+      <UniqueIdentifier>{916ee2e5-ec23-4614-9a27-0dade55201cb}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Header Files\analysis\calls">
+      <UniqueIdentifier>{93d8f2eb-2951-4217-9a33-1d9d34edd5c9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Header Files\analysis\data">
+      <UniqueIdentifier>{c4a42b3f-3d11-4d73-b4cd-223ff231a88b}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Header Files\analysis\positivity">
+      <UniqueIdentifier>{f4338f25-6b5b-4743-a489-2e7850e944da}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <None Include="core_Import.def">
     <ClInclude Include="includes\analysis\AnalysisVisitor.hxx">
       <Filter>Header Files\analysis</Filter>
     </ClInclude>
-    <ClInclude Include="includes\analysis\Checkers.hxx">
-      <Filter>Header Files\analysis</Filter>
-    </ClInclude>
     <ClInclude Include="includes\analysis\Decorator.hxx">
       <Filter>Header Files\analysis</Filter>
     </ClInclude>
     <ClInclude Include="includes\analysis\gvn\InferenceConstraint.hxx">
       <Filter>Header Files\analysis\gvn</Filter>
     </ClInclude>
+    <ClInclude Include="includes\analysis\calls\AddAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\Analyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\ArgnAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\CallAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\CeilAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\DiagAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\LengthAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\MatrixAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\MemInitAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\SizeAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\calls\SqrtAnalyzer.hxx">
+      <Filter>Header Files\analysis\calls</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_abs.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_acos.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_add.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_asin.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_atan.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_ceil.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_cos.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_cosh.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_cumprod.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_cumsum.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_dothypot.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_dotrdiv.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_dottimes.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_dottransp.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_erf.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_erfc.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_exp.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_fix.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_floor.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_hypot.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_int.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_int8.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_int16.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_int32.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_int64.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_isinf.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_isnan.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_krontimes.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_log.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_max.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_min.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_ones.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_prod.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_rand.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_round.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_sin.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_sinh.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_sinm.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_sqrt.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_sub.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_subt.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_sum.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_tan.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_tanh.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_times.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_transp.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_uint8.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_uint16.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_uint32.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_uint64.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\check_zeros.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\checkers\Checkers.hxx">
+      <Filter>Header Files\analysis\checkers</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\Block.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\CompleteMacroSignature.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\Data.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\DataManager.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\FunctionBlock.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\GlobalsCollector.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\Info.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\LoopBlock.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\MacroCache.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\MacroDef.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\MacroInfo.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\MacroSignature.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\PolymorphicMacroCache.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\TITypeSignatureTuple.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\TITypeTuple.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\data\XBlock.hxx">
+      <Filter>Header Files\analysis\data</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\positivity\PositivityVisitor.hxx">
+      <Filter>Header Files\analysis\positivity</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\Call.hxx">
+      <Filter>Header Files\analysis</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\Chrono.hxx">
+      <Filter>Header Files\analysis</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\analysis\Temporary.hxx">
+      <Filter>Header Files\analysis</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\cpp\ast\debugvisitor.cpp">
     <ClCompile Include="src\cpp\analysis\InferenceConstraints.cpp">
       <Filter>Source Files\ast\analysis</Filter>
     </ClCompile>
+    <ClCompile Include="src\cpp\analysis\AnalysisVisitor.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\ArgnAnalyzer.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\Block.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\Checkers.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\CompleteMacroSignature.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\ConstraintManager.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\DiagAnalyzer.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\FunctionBlock.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\LengthAnalyzer.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\LoopBlock.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\MacroDef.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\MatrixAnalyzer.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\MemInitAnalyzer.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\PolymorphicMacroCache.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\SizeAnalyzer.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\VisitListExp.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\VisitMatrixExp.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
+    <ClCompile Include="src\cpp\analysis\XBlock.cpp">
+      <Filter>Source Files\ast\analysis</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file
index 99f310a..f9fa293 100644 (file)
 #define __ANALYSIS_VISITOR_HXX__
 
 #include <algorithm>
-#include <chrono>
 #include <limits>
 #include <map>
 #include <memory>
+#include <vector>
 
 #include "visitor.hxx"
+#include "execvisitor.hxx"
 #include "allexp.hxx"
 #include "allvar.hxx"
-#include "Checkers.hxx"
+#include "calls/CallAnalyzer.hxx"
+#include "checkers/Checkers.hxx"
+#include "Chrono.hxx"
 #include "ForList.hxx"
 #include "Result.hxx"
 #include "SymInfo.hxx"
-#include "execvisitor.hxx"
+#include "Temporary.hxx"
+#include "TIType.hxx"
+
+#include "data/DataManager.hxx"
+#include "data/PolymorphicMacroCache.hxx"
+#include "gvn/ConstraintManager.hxx"
+#include "dynlib_ast.h"
 
 namespace analysis
 {
 
-class AnalysisVisitor : public ast::Visitor
+class EXTERN_AST AnalysisVisitor : public ast::Visitor, public Chrono
 {
 
 public:
 
     typedef std::map<symbol::Symbol, SymInfo> MapSymInfo;
+    typedef unordered_map<std::wstring, std::shared_ptr<CallAnalyzer>> MapSymCall;
+    typedef std::vector<Call *> Calls;
 
 private:
 
     MapSymInfo symsinfo;
     Result _result;
-    unsigned int scalars_tmp[TIType::COUNT][2];
-    unsigned int arrays_tmp[TIType::COUNT][2];
+    Temporary temp;
+    Calls allCalls;
+    DataManager dm;
+    PolymorphicMacroCache pmc;
+    ConstraintManager cm;
+
+    std::vector<Result> multipleLHS;
 
-    std::chrono::steady_clock::time_point start;
-    std::chrono::steady_clock::time_point end;
+    static MapSymCall symscall;
+    static MapSymCall initCalls();
 
 public:
 
+    static bool asDouble(ast::Exp & e, double & out);
+    static bool isDoubleConstant(const ast::Exp & e);
+    static bool asDoubleMatrix(ast::Exp & e, types::Double *& data);
+
     AnalysisVisitor()
     {
         start_chrono();
-        std::fill(&scalars_tmp[0][0], &scalars_tmp[0][0] + TIType::COUNT * 2, 0);
-        std::fill(&arrays_tmp[0][0], &arrays_tmp[0][0] + TIType::COUNT * 2, 0);
     }
 
-    const MapSymInfo & get_infos() const
+    virtual ~AnalysisVisitor()
+    {
+        //std::cerr << "delete AnalysisVisitor" << std::endl;
+    }
+
+    inline DataManager & getDM()
     {
-        return symsinfo;
+        return dm;
+    }
+
+    inline GVN & getGVN()
+    {
+        return dm.getGVN();
+    }
+
+    inline PolymorphicMacroCache & getPMC()
+    {
+        return pmc;
     }
 
     // Only for debug use
     inline void print_info()
     {
         stop_chrono();
-        std::wcout << L"Analysis duration: " << get_duration() << L" s" << std::endl;
 
-        std::wcout << L"Temporary scalars:" << std::endl;
-        for (unsigned int i = 0; i < TIType::COUNT; ++i)
-        {
-            if (scalars_tmp[i][0] || scalars_tmp[i][1])
-            {
-                std::wcout << TIType((TIType::Type)i) << ": " << scalars_tmp[i][0] << L" and " << scalars_tmp[i][1] << std::endl;
-            }
-        }
+        //std::wcout << getGVN() << std::endl << std::endl; function z=foo(x,y);z=argn(2);endfunction;jit("x=123;y=456;t=foo(x,y)")
+        // function z=foo(x,y);[z,u]=argn(0);endfunction;jit("x=123;y=456;t=foo(x,y)")
 
-        std::wcout << std::endl;
+        std::wcerr << L"Analysis: " << *static_cast<Chrono *>(this) << std::endl;
+        //std::wcout << temp << std::endl;
 
-        std::wcout << L"Temporary arrays:" << std::endl;
-        for (unsigned int i = 0; i < TIType::COUNT; ++i)
-        {
-            if (arrays_tmp[i][0] || arrays_tmp[i][1])
-            {
-                std::wcout << TIType((TIType::Type)i) << ": " << arrays_tmp[i][0] << L" and " << arrays_tmp[i][1] << std::endl;
-            }
-        }
+        std::wcerr << dm << std::endl;
 
-        std::wcout << std::endl;
+        std::wcerr << std::endl;
+    }
 
-        for (auto sym : symsinfo)
-        {
-            std::wcout << sym.first.getName() << L" -> " << sym.second << std::endl;
-        }
+    inline void finalize()
+    {
+        //dm.finalize(nullptr);
+    }
+
+    inline void setResult(Result & val)
+    {
+        _result = val;
+    }
 
-        std::wcout << std::endl;
+    inline void setResult(Result && val)
+    {
+        _result = val;
     }
 
-    void start_chrono()
+    inline Result & getResult()
     {
-        start = std::chrono::steady_clock::now();
+        return _result;
     }
 
-    void stop_chrono()
+    inline const Temporary & getTemp() const
     {
-        end = std::chrono::steady_clock::now();
+        return temp;
     }
 
-    double get_duration() const
+    inline Temporary & getTemp()
     {
-        return (double)std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count() * 1e-9;
+        return temp;
     }
 
-private:
+    inline const Calls & getCalls() const
+    {
+        return allCalls;
+    }
 
-    inline void add_tmp(const TIType & t, const int n = 1, const bool scalar = false)
+    inline std::vector<Result> & getLHSContainer()
     {
-        if (scalar)
+        return multipleLHS;
+    }
+
+    inline ConstraintManager & getCM()
+    {
+        if (FunctionBlock * fblock = getDM().topFunction())
         {
-            scalars_tmp[t.type][0] += n;
-            if (n > 0 && scalars_tmp[t.type][0] > scalars_tmp[t.type][1])
-            {
-                scalars_tmp[t.type][1] = scalars_tmp[t.type][0];
-            }
+            return fblock->getConstraintManager();
         }
         else
         {
-            arrays_tmp[t.type][0] += n;
-            if (n > 0 && arrays_tmp[t.type][0] > arrays_tmp[t.type][1])
-            {
-                arrays_tmp[t.type][1] = arrays_tmp[t.type][0];
-            }
+            return cm;
         }
     }
 
-    inline TIType get_ti(const symbol::Symbol & sym)
+    template<typename T>
+    inline void visitArguments(const std::wstring & name, const unsigned int lhs, const TIType & calltype, ast::CallExp & e, T && args)
     {
-        MapSymInfo::const_iterator i = symsinfo.find(sym);
-        if (i != symsinfo.end())
+        std::vector<Result> resargs;
+        std::vector<TIType> vargs;
+        vargs.reserve(args.size());
+        resargs.reserve(args.size());
+
+        for (typename T::const_iterator i = args.begin(), end = args.end(); i != end; ++i)
         {
-            return i->second.current_type;
+            if ((*i)->getDecorator().res.hasBeenVisited())
+            {
+                resargs.push_back((*i)->getDecorator().res);
+                vargs.push_back((*i)->getDecorator().res.getType());
+            }
+            else
+            {
+                (*i)->accept(*this);
+                resargs.push_back(getResult());
+                vargs.push_back(getResult().getType());
+            }
         }
 
-        types::InternalType * pIT = symbol::Context::getInstance()->get(sym);
-        TIType t;
-        if (pIT && pIT->isGenericType())
+        const symbol::Symbol & sym = static_cast<ast::SimpleVar &>(e.getName()).getSymbol();
+        int tempId = -1;
+        if (lhs > 1)
         {
-            TIType::Type type;
-            types::GenericType * pGT = static_cast<types::GenericType *>(pIT);
-            switch (pIT->getType())
+            std::vector<TIType> types = dm.call(*this, lhs, sym, vargs, &e);
+            multipleLHS.clear();
+            multipleLHS.reserve(types.size());
+            for (const auto & type : types)
             {
-                case types::InternalType::ScilabInt8 :
-                    type = TIType::Type::INT8;
-                    break;
-                case types::InternalType::ScilabUInt8 :
-                    type = TIType::Type::UINT8;
-                    break;
-                case types::InternalType::ScilabInt16 :
-                    type = TIType::Type::INT16;
-                    break;
-                case types::InternalType::ScilabUInt16 :
-                    type = TIType::Type::UINT16;
-                    break;
-                case types::InternalType::ScilabInt32 :
-                    type = TIType::Type::INT32;
-                    break;
-                case types::InternalType::ScilabUInt32 :
-                    type = TIType::Type::UINT32;
-                    break;
-                case types::InternalType::ScilabInt64 :
-                    type = TIType::Type::INT64;
-                    break;
-                case types::InternalType::ScilabUInt64 :
-                    type = TIType::Type::UINT64;
-                    break;
-                case types::InternalType::ScilabString :
-                    type = TIType::Type::STRING;
-                    break;
-                case types::InternalType::ScilabDouble :
-                {
-                    types::Double * pDbl = static_cast<types::Double *>(pGT);
-                    if (pDbl->isEmpty())
-                    {
-                        type = TIType::Type::EMPTY;
-                    }
-                    else if (pDbl->isComplex())
-                    {
-                        type = TIType::Type::COMPLEX;
-                    }
-                    else
-                    {
-                        type = TIType::Type::DOUBLE;
-                    }
-                    break;
-                }
-                case types::InternalType::ScilabBool :
-                    type = TIType::Type::BOOLEAN;
-                    break;
-                case types::InternalType::ScilabPolynom :
-                    type = TIType::Type::POLYNOMIAL;
-                    break;
-                case types::InternalType::ScilabSparse :
-                    type = TIType::Type::SPARSE;
-                    break;
-                default :
-                    type = TIType::Type::UNKNOWN;
+                multipleLHS.emplace_back(type);
             }
-
-            t = TIType(type, pGT->getRows(), pGT->getCols());
         }
         else
         {
-            t = TIType();
+            std::vector<TIType> out = dm.call(*this, lhs, sym, vargs, &e);
+            if (lhs == 1)
+            {
+                e.getDecorator().res = Result(out[0], tempId);
+                e.getDecorator().setCall(Call(calltype, name, vargs));
+                setResult(e.getDecorator().res);
+            }
         }
 
-        SymInfo si;
-        si.current_type = t;
-        symsinfo.emplace(sym, si);
 
-        return t;
+        /*TIType out = Checkers::check(name, vargs);
+          int tempId = -1;
+
+          if (true || (!out.isscalar() && args.size() == 1 && Checkers::isElementWise(name)))
+          {
+          Result & LR = resargs[0];
+          TIType & LT = vargs[0];
+          if (false && LR.istemp() && LT == out)
+          {
+          tempId = LR.getTempId();
+          }
+          else
+          {
+          tempId = temp.add(out);
+          }
+          }
+
+          e.getDecorator().res = Result(out, tempId);
+          e.getDecorator().setCall(Call(calltype, name, vargs));
+          setResult(e.getDecorator().res);*/
     }
 
-    inline void set_sym_use(const symbol::Symbol & sym, SymInfo::Kind k)
+    inline Info & getSymInfo(const symbol::Symbol & sym)
     {
-        MapSymInfo::iterator i = symsinfo.find(sym);
-        if (i != symsinfo.end())
-        {
-            i->second.set(k);
-        }
-        else
-        {
-            symsinfo.emplace(sym, k);
-        }
+        return dm.getInfo(sym);
     }
 
-    inline void set_sym_use(const symbol::Symbol & sym, SymInfo::Kind k1, SymInfo::Kind k2)
+private:
+
+    inline void pushCall(Call * c)
     {
-        MapSymInfo::iterator i = symsinfo.find(sym);
-        if (i != symsinfo.end())
-        {
-            i->second.set(k1, k2);
-        }
-        else
+        if (c)
         {
-            symsinfo.emplace(sym, SymInfo(k1, k2));
+            allCalls.push_back(c);
         }
     }
 
-    inline void set_sym_type(const symbol::Symbol & sym, const TIType & t)
+    void visit(ast::SimpleVar & e)
     {
-        MapSymInfo::iterator i = symsinfo.find(sym);
-        if (i != symsinfo.end())
+        symbol::Symbol & sym = e.getSymbol();
+        Info & info = dm.read(sym, &e);
+        e.getDecorator().res = Result(info.type);
+        double val;
+        if (info.asDouble(val))
         {
-            i->second.current_type = t;
+            e.getDecorator().res.setValue(val);
         }
-        else
+        else if (GVN::Value * gvnValue = info.getValue())
         {
-            SymInfo si;
-            si.current_type = t;
-            symsinfo.emplace(sym, si);
+            e.getDecorator().res.setGVNValue(gvnValue);
         }
-    }
 
-    inline void setResult(Result & val)
-    {
-        _result = val;
-    }
-
-    inline void setResult(Result && val)
-    {
-        _result = val;
-    }
-
-    inline Result & getResult()
-    {
-        return _result;
-    }
-
-    void visit(ast::SimpleVar & e)
-    {
-        symbol::Symbol sym = e.getSymbol();
-        TIType typ = get_ti(sym);
-        e.getDecorator().res = Result(typ, false, false);
         setResult(e.getDecorator().res);
-        set_sym_use(e.getSymbol(), SymInfo::READ);
     }
 
     void visit(ast::DollarVar & e)
@@ -299,7 +277,7 @@ private:
 
     void visit(ast::ArrayListVar & e)
     {
-        const ast::exps_t& vars = e.getVars();
+        const ast::exps_t & vars = e.getVars();
         for (auto var : vars)
         {
             var->accept(*this);
@@ -308,19 +286,20 @@ private:
 
     void visit(ast::DoubleExp & e)
     {
-        e.getDecorator().res = Result(TIType(TIType::DOUBLE, 1, 1), false, true);
+        e.getDecorator().res = Result(TIType(dm.getGVN(), TIType::DOUBLE));
+        e.getDecorator().res.setValue(e.getValue());
         setResult(e.getDecorator().res);
     }
 
     void visit(ast::BoolExp & e)
     {
-        e.getDecorator().res = Result(TIType(TIType::BOOLEAN, 1, 1), false, true);
+        e.getDecorator().res = Result(TIType(dm.getGVN(), TIType::BOOLEAN));
         setResult(e.getDecorator().res);
     }
 
     void visit(ast::StringExp & e)
     {
-        e.getDecorator().res = Result(TIType(TIType::STRING, 1, 1), false, true);
+        e.getDecorator().res = Result(TIType(dm.getGVN(), TIType::STRING));
         setResult(e.getDecorator().res);
     }
 
@@ -334,16 +313,31 @@ private:
         // nothing to do
     }
 
-    void visit(ast::CallExp & e)
+    void visit(ast::CallExp & e, const unsigned int lhs)
     {
-        e.getName().accept(*this);
-        const ast::exps_t* args = e.getArgs();
-        for (auto arg : *args)
+        if (e.getName().isSimpleVar())
         {
-            arg->accept(*this);
+            ast::SimpleVar & var = static_cast<ast::SimpleVar &>(e.getName());
+            symbol::Symbol & sym = var.getSymbol();
+            const std::wstring & name = sym.getName();
+            Info & info = getSymInfo(sym); // that put the sym in the current block !
+
+            // Special analysis cases: size, zeros, ones, ...
+            MapSymCall::iterator it = symscall.find(sym.getName());
+            if (it != symscall.end() && it->second.get()->analyze(*this, lhs, e))
+            {
+                pushCall(e.getDecorator().getCall());
+                return;
+            }
+
+            visitArguments(name, lhs, info.type, e, e.getArgs());
+            pushCall(e.getDecorator().getCall());
         }
+    }
 
-        delete args;
+    void visit(ast::CallExp & e)
+    {
+        visit(e, 1);
     }
 
     void visit(ast::CellCallExp & e)
@@ -357,29 +351,10 @@ private:
         Result LR = getResult();
         e.getRight().accept(*this);
         Result & RR = getResult();
-        const TIType & LType = LR.getType();
-        const TIType & RType = RR.getType();
+        TIType & LT = LR.getType();
+        TIType & RT = RR.getType();
         TIType resT;
-        bool allocTmp = false;
-
-        // We can released the temp vars
-        if (LR.isTemp())
-        {
-            add_tmp(LType, -1);
-        }
-        if (RR.isTemp())
-        {
-            add_tmp(RType, -1);
-        }
-
-        //if left and right are constant, result is constant too
-        if (e.getLeft().getDecorator().res.isConstant() && e.getRight().getDecorator().res.isConstant())
-        {
-            if (execAndReplace(e))
-            {
-                return;
-            }
-        }
+        int tempId = -1;
 
         switch (e.getOper())
         {
@@ -388,25 +363,89 @@ private:
             case ast::OpExp::dottimes :
             {
                 // TODO: check if the rules for addition and subtraction are the same
-                resT = check_add(LType, RType);
+                // If a temp is LHS or RHS we could use it again to avoid a malloc
+                // TODO: It should be ok for element-wise operations (check this assumption)
+                resT = check_add(dm.getGVN(), LT, RT);
+                if (resT.isUnknownDims())
+                {
+                    const bool ret = getCM().check(ConstraintManager::SAMEDIMS, LT.rows.getValue(), LT.cols.getValue(), RT.rows.getValue(), RT.cols.getValue());
+                    if (ret)
+                    {
+                        resT = check_add(dm.getGVN(), LT, RT);
+                    }
+                    else
+                    {
+                        resT = check_add(dm.getGVN(), LT.asUnknownMatrix(), RT.asUnknownMatrix());
+                    }
+                }
+                if (!resT.isscalar())
+                {
+                    if (LR.istemp() && LT == resT)
+                    {
+                        tempId = LR.getTempId();
+                        temp.remove(RT, RR.getTempId());
+                    }
+                    else if (RR.istemp() && RT == resT)
+                    {
+                        tempId = RR.getTempId();
+                        temp.remove(LT, LR.getTempId());
+                    }
+                    else
+                    {
+                        tempId = temp.add(resT);
+                    }
+                }
                 break;
             }
             case ast::OpExp::times :
             {
+                resT = check_times(dm.getGVN(), LT, RT);
+                if (resT.isUnknownDims())
+                {
+                    const bool ret = getCM().check(ConstraintManager::EQUAL, LT.cols.getValue(), RT.rows.getValue());
+                    if (ret)
+                    {
+                        resT = check_times(dm.getGVN(), LT, RT);
+                    }
+                    else
+                    {
+                        resT = check_times(dm.getGVN(), LT.asUnknownMatrix(), RT.asUnknownMatrix());
+                    }
+                }
+                temp.remove(LT, LR.getTempId());
+                temp.remove(RT, RR.getTempId());
+                if (resT.isknown() && !resT.isscalar())
+                {
+                    tempId = temp.add(resT);
+                }
+                break;
+            }
+            case ast::OpExp::rdivide :
+            {
                 // multiplication is not commutative for matrice pxq
-                resT = check_times(LType, RType);
+                resT = check_times(dm.getGVN(), LT, RT);
+                temp.remove(LT, LR.getTempId());
+                temp.remove(RT, RR.getTempId());
+                if (resT.isknown() && !resT.isscalar())
+                {
+                    tempId = temp.add(resT);
+                }
+                break;
+            }
+            case ast::OpExp::krontimes :
+            {
+                resT = check_krontimes(dm.getGVN(), LT, RT);
+                temp.remove(LT, LR.getTempId());
+                temp.remove(RT, RR.getTempId());
+                if (resT.isknown() && !resT.isscalar())
+                {
+                    tempId = temp.add(resT);
+                }
                 break;
             }
         }
 
-        if (resT.isknown() && !resT.isscalar())
-        {
-            // result is a matrix so we need a tmp
-            add_tmp(resT.type, 1);
-            allocTmp = true;
-        }
-
-        e.getDecorator().res = Result(resT, allocTmp, false);
+        e.getDecorator().res = Result(resT, tempId);
         setResult(e.getDecorator().res);
     }
 
@@ -418,63 +457,124 @@ private:
 
     void visit(ast::AssignExp & e)
     {
+        /*if (e.left_exp_get().is_simple_var())
+          {
+          ast::SimpleVar & var = static_cast<ast::SimpleVar &>(e.left_exp_get());
+          symbol::Symbol & sym = var.name_get();
+
+          e.right_exp_get().accept(*this);
+          Result & RR = getResult();
+          // Don't remove tmp... temp.remove(RR);
+          var.getDecorator().res = RR;
+
+          set_sym_use(sym, SymInfo::REPLACE);
+          set_sym_type(sym, getResult().get_type());
+          }
+          elseg
+          {
+          // TODO: handle this case
+          }*/
+
         if (e.getLeftExp().isSimpleVar())
         {
             ast::SimpleVar & var = static_cast<ast::SimpleVar &>(e.getLeftExp());
-            symbol::Symbol sym = var.getSymbol();
+            symbol::Symbol & sym = var.getSymbol();
 
-            if (e.getRightExp().isOpExp())
+            if (e.getRightExp().isSimpleVar())
+            {
+                // We have a=b (so the data associated to b is shared with a)
+                symbol::Symbol & symR = static_cast<ast::SimpleVar &>(e.getRightExp()).getSymbol();
+                dm.share(sym, symR, getSymInfo(symR).getType(), &e);
+            }
+            else
+            {
+                // We have something like a=expression
+                if (e.getRightExp().isCallExp())
+                {
+                    visit(static_cast<ast::CallExp &>(e.getRightExp()), /* LHS */ 1);
+                }
+                else
+                {
+                    e.getRightExp().accept(*this);
+                }
+                Result & RR = getResult();
+                // Don't remove tmp... temp.remove(RR);
+                var.getDecorator().res = RR;
+                Info & info = dm.define(sym, RR.getType(), &e);
+                double value;
+                if (asDouble(e.getRightExp(), value) || RR.getValue(value))
+                {
+                    info.setValue(value);
+                }
+                if (GVN::Value * gvnValue = RR.getGVNValue())
+                {
+                    info.setValue(gvnValue);
+                }
+            }
+        }
+        else if (e.getLeftExp().isCallExp())
+        {
+            // We have something like a(12)=...
+            ast::CallExp & ce = static_cast<ast::CallExp &>(e.getLeftExp());
+            if (ce.getName().isSimpleVar())
+            {
+                symbol::Symbol & symL = static_cast<ast::SimpleVar &>(ce.getName()).getSymbol();
+                e.getRightExp().accept(*this);
+                Result & RR = getResult();
+                ce.getDecorator().res = RR;
+                dm.write(symL, RR.getType(), &e);
+            }
+        }
+        else if (e.getLeftExp().isAssignListExp())
+        {
+            ast::AssignListExp & ale = static_cast<ast::AssignListExp &>(e.getLeftExp());
+            if (e.getRightExp().isCallExp())
             {
-                ast::OpExp * oe = e.getRightExp().getAs<ast::OpExp>();
-                if (oe->getOper() == ast::OpExp::plus)
+                const ast::exps_t & exps = ale.getExps();
+                visit(static_cast<ast::CallExp &>(e.getRightExp()), /* LHS */ exps.size());
+                std::vector<Result>::iterator j = multipleLHS.begin();
+                for (const auto exp : exps)
                 {
-                    ast::Exp& le = oe->getLeft();
-                    ast::Exp& re = oe->getRight();
-                    if (le.isSimpleVar() && re.isOpExp())
+                    // TODO: handle fields...
+                    if (exp->isSimpleVar() && j != multipleLHS.end())
                     {
-                        ast::OpExp * _oe = re.getAs<ast::OpExp>();
-                        if (static_cast<ast::SimpleVar &>(le).getSymbol() == sym && _oe->getOper() == ast::OpExp::times)
+                        ast::SimpleVar & var = *static_cast<ast::SimpleVar *>(exp);
+                        symbol::Symbol & sym = var.getSymbol();
+                        Info & info = dm.define(sym, j->getType(), exp);
+                        double value;
+                        if (j->getValue(value))
                         {
-                            ast::Exp* exp = new ast::DAXPYExp(e.getLocation(), _oe->getLeft(), _oe->getRight(), var);
-                            exp->setVerbose(e.isVerbose());
-                            exp->getDecorator().res = e.getDecorator().res;
-                            e.replace(exp);
+                            info.setValue(value);
                         }
-                    }
-                    else if (re.isSimpleVar() && le.isOpExp())
-                    {
-                        ast::OpExp * _oe = le.getAs<ast::OpExp>();
-                        if (static_cast<ast::SimpleVar &>(re).getSymbol() == sym && _oe->getOper() == ast::OpExp::times)
+                        if (GVN::Value * gvnValue = j->getGVNValue())
                         {
-                            ast::Exp* exp = new ast::DAXPYExp(e.getLocation(), _oe->getLeft(), _oe->getRight(), var);
-                            exp->setVerbose(e.isVerbose());
-                            exp->getDecorator().res = e.getDecorator().res;
-                            e.replace(exp);
+                            info.setValue(gvnValue);
                         }
+                        ++j;
                     }
                 }
             }
-
-            e.getRightExp().accept(*this);
-            var.getDecorator().res = getResult();
-
-            set_sym_use(sym, SymInfo::REPLACE);
-            set_sym_type(sym, getResult().getType());
-        }
-        else
-        {
-            // TODO: handle this case
         }
     }
 
     void visit(ast::IfExp & e)
     {
+        dm.addBlock(Block::EXCLUSIVE, &e);
+        // TODO: analyze the test, e.g. a=argn(2); if a==1....
+        // When we analyze a macro call, argn(2) is known so we are able to take the good branch and skip the analysis
+        // the others.
+        // There is a lot of code with: rhs=argn(2) or if argn(2)==1 ... then...
         e.getTest().accept(*this);
+        dm.addBlock(Block::NORMAL, &e.getThen());
         e.getThen().accept(*this);
+        dm.finalizeBlock();
+        dm.addBlock(Block::NORMAL, e.hasElse() ? &e.getElse() : nullptr);
         if (e.hasElse())
         {
             e.getElse().accept(*this);
         }
+        dm.finalizeBlock();
+        dm.finalizeBlock();
     }
 
     void visit(ast::WhileExp & e)
@@ -485,14 +585,22 @@ private:
 
     void visit(ast::ForExp & e)
     {
+        dm.addBlock(Block::LOOP, &e);
         e.getVardec().accept(*this);
+        dm.addBlock(Block::NORMAL, &e.getBody());
         e.getBody().accept(*this);
 
-        MapSymInfo::const_iterator it = symsinfo.find(e.getVardec().getAs<ast::VarDec>()->getSymbol());
-        if (it->second.read)
+        if (dm.requiresAnotherTrip())
         {
-            e.getVardec().getAs<ast::VarDec>()->getListInfo().setReadInLoop(true);
+            std::cerr << "Invalid forexp: types or refcount are not the same before and after the loop" << std::endl;
+
+            dm.finalizeBlock();
+            dm.addBlock(Block::NORMAL, &e.getBody());
+            e.getBody().accept(*this);
         }
+
+        dm.finalizeBlock();
+        dm.finalizeBlock();
     }
 
     void visit(ast::BreakExp & e)
@@ -513,15 +621,23 @@ private:
 
     void visit(ast::SelectExp & e)
     {
+        dm.addBlock(Block::EXCLUSIVE, &e);
         e.getSelect()->accept(*this);
-        ast::exps_t* cases = e.getCases();
-        for (auto c : *cases)
+        ast::exps_t cases = e.getCases();
+        for (auto exp : cases)
         {
-            c->accept(*this);
+            dm.addBlock(Block::NORMAL, exp);
+            exp->accept(*this);
+            dm.finalizeBlock();
         }
-        delete cases;
 
-        e.getDefaultCase()->accept(*this);
+        if (e.getDefaultCase())
+        {
+            dm.addBlock(Block::NORMAL, e.getDefaultCase());
+            e.getDefaultCase()->accept(*this);
+            dm.finalizeBlock();
+        }
+        dm.finalizeBlock();
     }
 
     void visit(ast::CaseExp & e)
@@ -532,15 +648,16 @@ private:
 
     void visit(ast::ReturnExp & e)
     {
-        e.getExp().accept(*this);
+        // Bug with return;
+        //e.exp_get().accept(*this);
     }
 
     void visit(ast::FieldExp & e)
     {
         // a.b.c <=> (a.b).c where a.b is the head and c is the tail
 
-        //e.getHead()->accept(*this);
-        //e.getTail()->accept(*this);
+        //e.head_get()->accept(*this);
+        //e.tail_get()->accept(*this);
     }
 
     void visit(ast::NotExp & e)
@@ -551,43 +668,14 @@ private:
     void visit(ast::TransposeExp & e)
     {
         e.getExp().accept(*this);
+        Result & res = getResult();
+        const TIType & type = res.getType();
+        e.getDecorator().res = Result(TIType(dm.getGVN(), type.type, type.cols, type.rows));
+        setResult(e.getDecorator().res);
     }
 
-    void visit(ast::MatrixExp & e)
-    {
-        const ast::exps_t& lines = e.getLines();
-        bool constant = true;
-        for (auto line : lines)
-        {
-            line->accept(*this);
-            if (line->getDecorator().res.isConstant() == false)
-            {
-                constant = false;
-            }
-        }
-
-        if (constant)
-        {
-            execAndReplace(e);
-        }
-    }
-
-    void visit(ast::MatrixLineExp & e)
-    {
-        const ast::exps_t& columns = e.getColumns();
-        bool constant = true;
-        for (auto col : columns)
-        {
-            col->accept(*this);
-            if (col->getDecorator().res.isConstant() == false)
-            {
-                constant = false;
-            }
-        }
-
-        e.getDecorator().res = Result(e.getDecorator().res.getType(), e.getDecorator().res.isTemp(), constant);
-
-    }
+    void visit(ast::MatrixExp & e);
+    void visit(ast::MatrixLineExp & e) { }
 
     void visit(ast::CellExp & e)
     {
@@ -596,17 +684,23 @@ private:
 
     void visit(ast::SeqExp & e)
     {
-        const ast::exps_t& exps = e.getExps();
-        for (auto exp : exps)
+        for (const auto exp : e.getExps())
         {
-            exp->accept(*this);
+            if (exp->isCallExp())
+            {
+                visit(*static_cast<ast::CallExp *>(exp), /* LHS */ 0);
+            }
+            else
+            {
+                exp->accept(*this);
+            }
         }
     }
 
     void visit(ast::ArrayListExp & e)
     {
-        const ast::exps_t& exps = e.getExps();
-        for (auto exp : exps)
+        const ast::exps_t & exps = e.getExps();
+        for (const auto exp : e.getExps())
         {
             exp->accept(*this);
         }
@@ -620,18 +714,16 @@ private:
     void visit(ast::VarDec & e)
     {
         // VarDec is only used in For loop for iterator declaration
-        symbol::Symbol sym = e.getSymbol();
+        const symbol::Symbol & sym = e.getSymbol();
         if (e.getInit().isListExp())
         {
             ast::ListExp & le = static_cast<ast::ListExp &>(e.getInit());
-            if (le.getStart().isDoubleExp() && le.getStep().isDoubleExp() && le.getEnd().isDoubleExp())
+            double start, step, end;
+            if (asDouble(le.getStart(), start) && asDouble(le.getStep(), step) && asDouble(le.getEnd(), end))
             {
-                ForList64 fl(static_cast<const ast::DoubleExp &>(le.getStart()).getValue(),
-                             static_cast<const ast::DoubleExp &>(le.getStep()).getValue(),
-                             static_cast<const ast::DoubleExp &>(le.getEnd()).getValue());
+                ForList64 fl(start, step, end);
                 e.setListInfo(fl);
-                set_sym_use(sym, SymInfo::REPLACE, SymInfo::FOR_IT);
-                set_sym_type(sym, fl.getType());
+                dm.define(sym, fl.getType(), &e).isint = true;
                 // No need to visit the list (it has been visited just before)
             }
             else
@@ -644,114 +736,20 @@ private:
 
     void visit(ast::FunctionDec & e)
     {
-        e.getArgs().accept(*this);
-        e.getReturns().accept(*this);
-        e.getBody().accept(*this);
+        /*e.args_get().accept(*this);
+          e.returns_get().accept(*this);
+          e.body_get().accept(*this);*/
+        dm.macrodef(&e);
     }
 
-    void visit(ast::ListExp & e)
-    {
-        double start = std::numeric_limits<double>::quiet_NaN();
-        double step = std::numeric_limits<double>::quiet_NaN();
-        double end = std::numeric_limits<double>::quiet_NaN();
-
-        if (e.getStart().isDoubleExp())
-        {
-            start = static_cast<const ast::DoubleExp &>(e.getStart()).getValue();
-        }
-
-        if (e.getStep().isDoubleExp())
-        {
-            step = static_cast<ast::DoubleExp &>(e.getStep()).getValue();
-        }
+    void visit(ast::ListExp & e);
 
-        if (e.getEnd().isDoubleExp())
-        {
-            end = static_cast<ast::DoubleExp &>(e.getEnd()).getValue();
-        }
-
-        const_cast<ast::ListExp &>(e).setValues(start, step, end);
-    }
-
-    /* optimized */
     void visit(ast::OptimizedExp & e)
     {
-        //gné ??? Oo
     }
 
     void visit(ast::DAXPYExp & e)
     {
-        //gné ??? Oo
-    }
-
-    bool replaceDAXPY(ast::OpExp& e)
-    {
-        bool ret = false;
-
-        if (e.getOper() == ast::OpExp::plus)
-        {
-            ast::Exp& le = e.getLeft();
-            ast::Exp& re = e.getRight();
-            ast::Exp* a = NULL;
-            ast::Exp* x = NULL;
-            ast::Exp* y = NULL;
-
-            // a * x(i,j) + y(i,j) or y(i,j) + a * x(i,j)
-
-            if (le.isOpExp() && le.getAs<ast::OpExp>()->getOper() == ast::OpExp::dottimes)
-            {
-                ast::OpExp* dt = le.getAs<ast::OpExp>();
-                y = &re;
-                a = &dt->getLeft();
-                x = &dt->getRight();
-            }
-            else if (re.isOpExp() && re.getAs<ast::OpExp>()->getOper() == ast::OpExp::dottimes)
-            {
-                ast::OpExp* rt = re.getAs<ast::OpExp>();
-                y = &le;
-                a = &rt->getLeft();
-                x = &rt->getRight();
-            }
-
-            if (a && x && y)
-            {
-                //checks dimensions of x and y
-                ast::Exp* exp = new ast::DAXPYExp(e.getLocation(), *a, *x, *y);
-                exp->setVerbose(e.isVerbose());
-                exp->getDecorator().res = e.getDecorator().res;
-                e.replace(exp);
-                ret = true;
-            }
-        }
-        return ret;
-    }
-
-    bool execAndReplace(ast::Exp& e)
-    {
-        //exec operation and substitute exp by result
-        ast::ExecVisitor exec;
-
-        try
-        {
-            e.accept(exec);
-            InternalType* result = exec.getResult();
-            ast::Exp* exp = result->getExp(e.getLocation());
-            if (exp)
-            {
-                exp->setVerbose(e.isVerbose());
-                e.replace(exp);
-                exp->getDecorator().res = Result(e.getDecorator().res.getType(), e.getDecorator().res.isTemp(), true);
-                setResult(exp->getDecorator().res);
-                return true;
-            }
-        }
-        catch (const ast::ScilabException& /*se*/)
-        {
-            //nothing to do, stop optimization phase and continue.
-            std::cout << "optimization failed !" << std::endl;
-        }
-
-        return false;
     }
 };
 
diff --git a/scilab/modules/ast/includes/analysis/Call.hxx b/scilab/modules/ast/includes/analysis/Call.hxx
new file mode 100644 (file)
index 0000000..3bf7d15
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+ *
+ *  This file must be used under the terms of the CeCILL.
+ *  This source file is licensed as described in the file COPYING, which
+ *  you should have received as part of this distribution.  The terms
+ *  are also available at
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __CALL_HXX__
+#define __CALL_HXX__
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "TIType.hxx"
+
+namespace analysis
+{
+    class Call
+    {
+
+    public:
+       
+       enum Kind {UNDEFINED, IDENTITY, HYPOT, DOTHYPOT, __COUNT__};
+
+    private:
+
+       Kind kind;
+        TIType type;
+       std::wstring name;
+       std::vector<TIType> args;
+
+    public:
+
+        Call(Kind _kind, const TIType & _type, const std::wstring & _name, const std::vector<TIType> & _args) : kind(_kind),
+                                                                                                               type(_type),
+                                                                                                               name(_name),
+                                                                                                               args(_args) { }
+
+        Call(const TIType & _type, const std::wstring & _name, const std::vector<TIType> & _args) : Call(UNDEFINED, _type, _name, _args) { }
+       Call(Kind _kind, const TIType & _type, const std::wstring & _name) : kind(_kind),
+                                                                            type(_type),
+                                                                            name(_name) { }
+       Call(const TIType & _type, const std::wstring & _name) : Call(UNDEFINED, _type, _name) { }
+       
+       Call(const std::wstring & _name) : kind(UNDEFINED), type(), name(_name) { }
+        Call(Call && call) : kind(call.kind), type(call.type), name(call.name), args(call.args) { }
+
+        inline void setName(const std::wstring & _name)
+            {
+                name = _name;
+            }
+
+        inline const std::wstring & getName() const
+            {
+                return name;
+            }
+
+        inline const TIType & getType() const
+            {
+                return type;
+            }
+
+       inline void setKind(Kind _kind)
+           {
+               kind = _kind;
+           }
+
+       inline Kind getKind() const
+           {
+               return kind;
+           }
+
+       inline void setArgs(const std::vector<TIType> & _args)
+           {
+               args = _args;
+           }
+       
+       inline std::vector<TIType> & getArgs()
+           {
+               return args;
+           }
+
+        friend std::wostream & operator<<(std::wostream & out, const Call & res)
+            {
+                out << L"Call " << res.name << L"{" << res.type << L"}, Identity:" << (res.kind == IDENTITY ? L"T" : L"F");
+                return out;
+            }
+    };
+
+} // namespace analysis
+
+#endif // __CALL_HXX__
diff --git a/scilab/modules/ast/includes/analysis/Checkers.hxx b/scilab/modules/ast/includes/analysis/Checkers.hxx
deleted file mode 100644 (file)
index 9fe40bb..0000000
+++ /dev/null
@@ -1,3772 +0,0 @@
-/*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
- *
- *  This file must be used under the terms of the CeCILL.
- *  This source file is licensed as described in the file COPYING, which
- *  you should have received as part of this distribution.  The terms
- *  are also available at
- *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-
-// This file has been generated, so don't modify it by hand !!
-
-#ifndef __CHECKERS_HXX__
-#define __CHECKERS_HXX__
-
-#include "TIType.hxx"
-
-namespace analysis
-{
-inline static TIType check_add(const TIType & in0, const TIType & in1)
-{
-    switch (in0.type)
-    {
-        case TIType::EMPTY :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in0;
-                }
-                case TIType::BOOLEAN :
-                {
-                    return in0;
-                }
-                case TIType::COMPLEX :
-                {
-                    return in0;
-                }
-                case TIType::DOUBLE :
-                {
-                    return in0;
-                }
-                case TIType::INT16 :
-                {
-                    return in0;
-                }
-                case TIType::INT32 :
-                {
-                    return in0;
-                }
-                case TIType::INT64 :
-                {
-                    return in0;
-                }
-                case TIType::INT8 :
-                {
-                    return in0;
-                }
-                case TIType::STRING :
-                {
-                    return in0;
-                }
-                case TIType::UINT16 :
-                {
-                    return in0;
-                }
-                case TIType::UINT32 :
-                {
-                    return in0;
-                }
-                case TIType::UINT64 :
-                {
-                    return in0;
-                }
-                case TIType::UINT8 :
-                {
-                    return in0;
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::BOOLEAN :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::COMPLEX :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::DOUBLE :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT16 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT32 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT64 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT8 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::STRING :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::STRING :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT16 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT32 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT64 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT8 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in1;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.rows && in1.cols == in0.cols)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        default :
-            return TIType(TIType::UNKNOWN);
-    }
-}
-
-inline static TIType check_times(const TIType & in0, const TIType & in1)
-{
-    switch (in0.type)
-    {
-        case TIType::EMPTY :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in0;
-                }
-                case TIType::BOOLEAN :
-                {
-                    return in0;
-                }
-                case TIType::COMPLEX :
-                {
-                    return in0;
-                }
-                case TIType::DOUBLE :
-                {
-                    return in0;
-                }
-                case TIType::INT16 :
-                {
-                    return in0;
-                }
-                case TIType::INT32 :
-                {
-                    return in0;
-                }
-                case TIType::INT64 :
-                {
-                    return in0;
-                }
-                case TIType::INT8 :
-                {
-                    return in0;
-                }
-                case TIType::STRING :
-                {
-                    return in0;
-                }
-                case TIType::UINT16 :
-                {
-                    return in0;
-                }
-                case TIType::UINT32 :
-                {
-                    return in0;
-                }
-                case TIType::UINT64 :
-                {
-                    return in0;
-                }
-                case TIType::UINT8 :
-                {
-                    return in0;
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::BOOLEAN :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::COMPLEX :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::DOUBLE :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::DOUBLE, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::COMPLEX :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::COMPLEX, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::DOUBLE, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT16 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT32 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT64 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::INT8 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::INT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::INT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::STRING :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::STRING :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::STRING, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT16 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT32 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT64 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        case TIType::UINT8 :
-        {
-            switch (in1.type)
-            {
-                case TIType::EMPTY :
-                {
-                    return in1;
-                }
-                case TIType::BOOLEAN :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::DOUBLE :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::INT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return TIType(TIType::UINT8, in1.rows, in1.cols);
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT16 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT16, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT32 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT32, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT64 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in0.cols);
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT64, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                case TIType::UINT8 :
-                {
-                    if (in0.rows == 1 && in0.cols == 1)
-                    {
-                        return in1;
-                    }
-                    if (in1.rows == 1 && in1.cols == 1)
-                    {
-                        return in0;
-                    }
-                    if (in1.rows == in0.cols)
-                    {
-                        return TIType(TIType::UINT8, in0.rows, in1.cols);
-                    }
-                    return TIType(TIType::UNKNOWN);
-                }
-                default :
-                    return TIType(TIType::UNKNOWN);
-            }
-            return TIType(TIType::UNKNOWN);
-        }
-        default :
-            return TIType(TIType::UNKNOWN);
-    }
-}
-
-} // namespace analysis
-
-#endif // __CHECKERS_HXX__
\ No newline at end of file
diff --git a/scilab/modules/ast/includes/analysis/Chrono.hxx b/scilab/modules/ast/includes/analysis/Chrono.hxx
new file mode 100644 (file)
index 0000000..a24d814
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+ *
+ *  This file must be used under the terms of the CeCILL.
+ *  This source file is licensed as described in the file COPYING, which
+ *  you should have received as part of this distribution.  The terms
+ *  are also available at
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#ifndef __CHRONO_HXX__
+#define __CHRONO_HXX__
+
+#include <chrono>
+#include <iostream>
+
+namespace analysis
+{
+
+    class Chrono
+    {
+        std::chrono::steady_clock::time_point start;
+        std::chrono::steady_clock::time_point end;
+
+    public:
+
+       void start_chrono()
+            {
+                start = std::chrono::steady_clock::now();
+            }
+       
+        void stop_chrono()
+            {
+                end = std::chrono::steady_clock::now();
+            }
+       
+        double get_duration() const
+            {
+                return (double)std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count() * 1e-9;
+            } 
+
+       friend std::wostream & operator<<(std::wostream & out, const Chrono & chrono)
+           {
+               out << L"Elapsed time: " << chrono.get_duration() << L" s.";
+               return out;
+           }
+    };
+    
+} // namespace analysis
+
+#endif // __CHRONO_HXX__
index 7c0e988..0aaabd0 100644 (file)
 #ifndef __DECORATOR_HXX__
 #define __DECORATOR_HXX__
 
+#include "Call.hxx"
 #include "Result.hxx"
 
 #include <iostream>
 
 namespace analysis
 {
-struct Decorator
-{
-    Result res;
-
-    Decorator() : res() { }
 
-    friend std::wostream & operator<<(std::wostream & out, const Decorator & deco)
+    struct Decorator
     {
-        out << deco.res;
-        return out;
-    }
-};
+        Result res;
+       Call * call;
+       bool cloneData;
+       bool deleteData;
+       bool hasRefCount;
+
+        Decorator() : res(), call(nullptr), cloneData(false), deleteData(false), hasRefCount(false) { }
+
+       ~Decorator()
+           {
+               delete call;
+           }
+
+       inline Call * getCall() const
+           {
+               return call;
+           }
+
+       inline Call & setCall(Call && call)
+           {
+               this->call = new Call(std::move(call));
+               return *this->call;
+           }
+
+       inline Call & setCall(Call * call)
+           {
+               this->call = call;
+               return *this->call;
+           }
+
+        friend std::wostream & operator<<(std::wostream & out, const Decorator & deco)
+            {
+               out << deco.res;
+               if (deco.call)
+               {
+                   out << L", " << (*deco.call);
+               }
+               out << L", Cl:" << (deco.cloneData ? L"T" : L"F")
+                   << L", Del:" << (deco.deleteData ? L"T" : L"F")
+                   << L", RefC:" << (deco.hasRefCount ? L"T" : L"F");
+
+                return out;
+            }
+    };
 
 } // namespace analysis
 
index 182a1dd..d193e36 100644 (file)
 #include <iostream>
 #include <type_traits>
 
+#include "tools.hxx"
 #include "TIType.hxx"
 #include "core_math.h"
 
-#ifdef _MSC_VER
-#include "stdint.h"
-#define TRUNC(x) ((x) > 0 ? floor(x) : ceil(x))
-#else
-#ifdef __APPLE__
-#define TRUNC(x) ((x) > 0 ? floor(x) : ceil(x))
-#else
-#define TRUNC(x) (std::trunc(x))
-#endif
-#endif
-
 namespace analysis
 {
 template<typename T>
@@ -51,14 +41,14 @@ public:
 
     ForList(const double m, const double s, const double M) : constant(true), read_in_loop(false), min(m), step(s), max(M)
     {
-        if (!isEmpty())
+        if (!isempty())
         {
-            if (min >= 0 && step > 0 && isInt<typename std::make_unsigned<T>::type>(min) && isInt<typename std::make_unsigned<T>::type>(step) && !overflow<typename std::make_unsigned<T>::type>(min, step, max))
+            if (min >= 0 && step > 0 && is_int<typename std::make_unsigned<T>::type>(min) && is_int<typename std::make_unsigned<T>::type>(step) && !overflow<typename std::make_unsigned<T>::type>(min, step, max))
             {
                 _int = true;
                 _unsigned = true;
             }
-            else if (isInt<typename std::make_signed<T>::type>(min) && isInt<typename std::make_signed<T>::type>(step) && !overflow<typename std::make_signed<T>::type>(min, step, max))
+            else if (is_int<typename std::make_signed<T>::type>(min) && is_int<typename std::make_signed<T>::type>(step) && !overflow<typename std::make_signed<T>::type>(min, step, max))
             {
                 _int = true;
                 _unsigned = false;
@@ -76,47 +66,47 @@ public:
         }
     }
 
-    inline bool isReadInLoop() const
+    inline bool is_read_in_loop() const
     {
         return read_in_loop;
     }
 
-    inline void setReadInLoop(const bool read)
+    inline void set_read_in_loop(const bool read)
     {
         read_in_loop = read;
     }
 
-    inline bool isConstant() const
+    inline bool is_constant() const
     {
         return constant;
     }
 
-    inline bool isInt() const
+    inline bool is_int() const
     {
         return _int;
     }
 
-    inline bool isUInt() const
+    inline bool is_uint() const
     {
         return _unsigned;
     }
 
     template<typename U>
-    inline U getMin() const
+    inline U get_min() const
     {
-        return std::is_integral<U>::value ? TRUNC(min) : min;
+        return std::is_integral<U>::value ? tools::trunc(min) : min;
     }
 
     template<typename U>
-    inline U getStep() const
+    inline U get_step() const
     {
-        return std::is_integral<U>::value ? TRUNC(step) : step;
+        return std::is_integral<U>::value ? tools::trunc(step) : step;
     }
 
     template<typename U>
-    inline U getMax() const
+    inline U get_max() const
     {
-        return std::is_integral<U>::value ? TRUNC(max) : max;
+        return std::is_integral<U>::value ? tools::trunc(max) : max;
     }
 
     inline TIType getType() const
@@ -163,23 +153,81 @@ public:
         return out;
     }
 
+    inline static bool isempty(const double min, const double max, const double step)
+    {
+        return step == 0 || tools::isNaN(min) || tools::isNaN(step) || tools::isNaN(max) || !tools::isFinite(min) || !tools::isFinite(step) || !tools::isFinite(max) || (min < max && step < 0) || (min > max && step > 0);
+    }
+
+    inline static uint64_t size(const double min, const double max, const double step)
+       {
+           return (uint64_t)std::floor((max - min) / step) + 1;
+       }
+
+    inline static int checkList(const double min, const double max, const double step, double & out)
+       {
+           if (step == 0)
+           {
+               if (tools::isNaN(min) || tools::isNaN(max))
+               {
+                   out = tools::NaN();
+                   return 1; // one value
+               }
+               else
+               {
+                   return 0; // empty
+               }
+           }
+           else
+           {
+               if (tools::isNaN(min) || tools::isNaN(step) || tools::isNaN(max))
+               {
+                   out = tools::NaN();
+                   return 1; // one value
+               }
+               else
+               {
+                   if (min < max)
+                   {
+                       if (step < 0)
+                       {
+                           return 0; //empty
+                       }
+