# HG changeset patch # User John W. Eaton # Date 1455176214 18000 # Node ID 7be239ae42c81eeaf61b8ec67cb3982249eff112 # Parent 101489515a70ee5e583a3d420b2edaab3928348a merge sparse-mk-ops.awk and mk-ops.awk scripts * mx-ops.awk: Merge with sparse-mk-ops.awk. Generate a single output file at a time and always write to stdout. * sparse-mk-ops.awk: Delete. * liboctave/module.mk, liboctave/operators/module.mk: Adapt rules. * liboctave/operators/config-ops.sh: Update for modified mk-ops.awk script. * mx-ops, smx-ops, vx-ops: Improve comments. diff -r 101489515a70 -r 7be239ae42c8 liboctave/module.mk --- a/liboctave/module.mk Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/module.mk Thu Feb 11 02:36:54 2016 -0500 @@ -23,15 +23,12 @@ octlib_LTLIBRARIES += liboctave/liboctave.la BUILT_INCS = \ - liboctave/operators/mx-ops.h \ - liboctave/operators/smx-ops.h \ - liboctave/operators/vx-ops.h \ - $(LIBOCTAVE_OPT_INC) \ - $(MX_OP_INC) \ - $(VX_OP_INC) \ - $(SMX_OP_INC) + $(BUILT_LIBOCTAVE_OPERATORS_INC) \ + $(LIBOCTAVE_OPT_INC) -BUILT_SOURCES += $(BUILT_INCS) +BUILT_SOURCES += \ + $(BUILT_INCS) \ + $(BUILT_LIBOCTAVE_OPERATORS_SOURCES) octinclude_HEADERS += \ $(ARRAY_INC) \ @@ -43,8 +40,7 @@ $(OTHER_INC) \ $(LIBOCTAVE_TEMPLATE_SRC) -nodist_octinclude_HEADERS += \ - $(BUILT_INCS) +nodist_octinclude_HEADERS += $(BUILT_INCS) ## C++ files that are #included, not compiled OTHER_INC = diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/config-ops.sh --- a/liboctave/operators/config-ops.sh Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/operators/config-ops.sh Thu Feb 11 02:36:54 2016 -0500 @@ -27,13 +27,12 @@ liboctave_dir="$top_srcdir/liboctave/operators" mk_ops="$liboctave_dir/mk-ops.awk" -sparse_mk_ops="$liboctave_dir/sparse-mk-ops.awk" case "$obj_type" in vx | all) case "$src_type" in inc | all) - VX_INC=$($AWK -f $mk_ops prefix=vx list_h_files=1 $liboctave_dir/vx-ops) + VX_INC=$($AWK -f $mk_ops -v prefix=vx -v list_h_files=1 $liboctave_dir/vx-ops) echo "VX_OP_INC = $VX_INC" > $liboctave_dir/vx-op-inc.mk-t $move_if_change $liboctave_dir/vx-op-inc.mk-t $liboctave_dir/vx-op-inc.mk ;; @@ -45,7 +44,7 @@ vx | all) case "$src_type" in src | all) - VX_SRC=$($AWK -f $mk_ops prefix=vx list_cc_files=1 $liboctave_dir/vx-ops) + VX_SRC=$($AWK -f $mk_ops -v prefix=vx -v list_cc_files=1 $liboctave_dir/vx-ops) echo "VX_OP_SRC = $VX_SRC" > $liboctave_dir/vx-op-src.mk-t $move_if_change $liboctave_dir/vx-op-src.mk-t $liboctave_dir/vx-op-src.mk ;; @@ -57,7 +56,7 @@ mx | all) case "$src_type" in inc | all) - MX_INC=$($AWK -f $mk_ops prefix=mx list_h_files=1 $liboctave_dir/mx-ops) + MX_INC=$($AWK -f $mk_ops -v prefix=mx -v list_h_files=1 $liboctave_dir/mx-ops) echo "MX_OP_INC = $MX_INC" > $liboctave_dir/mx-op-inc.mk-t $move_if_change $liboctave_dir/mx-op-inc.mk-t $liboctave_dir/mx-op-inc.mk ;; @@ -69,7 +68,7 @@ mx | all) case "$src_type" in src | all) - MX_SRC=$($AWK -f $mk_ops prefix=mx list_cc_files=1 $liboctave_dir/mx-ops) + MX_SRC=$($AWK -f $mk_ops -v prefix=mx -v list_cc_files=1 $liboctave_dir/mx-ops) echo "MX_OP_SRC = $MX_SRC" > $liboctave_dir/mx-op-src.mk-t $move_if_change $liboctave_dir/mx-op-src.mk-t $liboctave_dir/mx-op-src.mk ;; @@ -81,7 +80,7 @@ smx | all) case "$src_type" in inc | all) - SMX_INC=$($AWK -f $sparse_mk_ops prefix=smx list_h_files=1 $liboctave_dir/smx-ops) + SMX_INC=$($AWK -f $mk_ops -v prefix=smx -v list_h_files=1 $liboctave_dir/smx-ops) echo "SMX_OP_INC = $SMX_INC" > $liboctave_dir/smx-op-inc.mk-t $move_if_change $liboctave_dir/smx-op-inc.mk-t $liboctave_dir/smx-op-inc.mk ;; @@ -93,7 +92,7 @@ smx | all) case "$src_type" in src | all) - SMX_SRC=$($AWK -f $sparse_mk_ops prefix=smx list_cc_files=1 $liboctave_dir/smx-ops) + SMX_SRC=$($AWK -f $mk_ops -v prefix=smx -v list_cc_files=1 $liboctave_dir/smx-ops) echo "SMX_OP_SRC = $SMX_SRC" > $liboctave_dir/smx-op-src.mk-t $move_if_change $liboctave_dir/smx-op-src.mk-t $liboctave_dir/smx-op-src.mk ;; diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/mk-ops.awk --- a/liboctave/operators/mk-ops.awk Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/operators/mk-ops.awk Thu Feb 11 02:36:54 2016 -0500 @@ -19,25 +19,69 @@ BEGIN { declare_types = 0; generate_ops = 0; + op_class = ""; + sparse = 0; ntypes = 0; -} { - if (NR == 1 && make_inclusive_header) + make_inclusive_header = 0; + make_header = 0; + make_source = 0; + + if (build_file) { - print "// DO NOT EDIT -- generated by mk-ops"; - tmp = make_inclusive_header; - gsub (/[\.-]/, "_", tmp); - printf ("#if ! defined (octave_%s)\n", tmp); - printf ("#define octave_%s 1\n", tmp); - print "#include \"octave-config.h\""; + if (build_file == "mx-ops.h" || build_file == "smx-ops.h" || build_file == "vx-ops.h") + { + make_inclusive_header = 1; + + print "// DO NOT EDIT -- generated by mk-ops.awk"; + tmp = build_file; + prefix = substr (tmp, 1, index (tmp, "-")-1); + gsub (/[\.-]/, "_", tmp); + printf ("#if ! defined (octave_%s)\n", tmp); + printf ("#define octave_%s 1\n", tmp); + print "#include \"octave-config.h\""; + } + else + { + if (match (build_file, /\.h$/)) + { + make_header = 1; + + tmp = substr (build_file, 1, length (build_file)-2); + } + else if (match (build_file, /\.cc$/)) + { + make_source = 1; + + tmp = substr (build_file, 1, length (build_file)-3); + } + + prefix = substr (tmp, 1, index (tmp, "-")-1); + tmp = substr (tmp, index (tmp, "-")+1); + lhs_arg = substr (tmp, 1, index (tmp, "-")-1); + rhs_arg = substr (tmp, index (tmp, "-")+1); + } } } /^#/ { if ($2 == "types") declare_types = 1; - else if ($2 == "ops") + else if ($3 == "operators") { + op_class = $2; generate_ops = 1; declare_types = 0; + + if (op_class == "vector") + sparse = 0; + else if (op_class == "full-matrix") + sparse = 0; + else if (op_class == "sparse-matrix") + sparse = 1; + else + { + printf ("unrecognized object type: %s", op_class); + exit (1); + } } next; } { @@ -63,21 +107,27 @@ } else if (generate_ops) { - if (NF >= 4) + if (NF >= 4 || (sparse && NF >= 5)) { - result_tag = $1; - lhs_tag = $2; - rhs_tag = $3; - op_type = $4; + n = 0; + + result_tag_1 = $(++n); + if (sparse) + result_tag_2 = $(++n); + lhs_tag = $(++n); + rhs_tag = $(++n); + op_type = $(++n); bin_ops = index (op_type, "B") != 0; cmp_ops = index (op_type, "C") != 0; + eqne_ops = index (op_type, "E") != 0; bool_ops = index (op_type, "L") != 0; - n = 4; - - lhs_conv = cmp_ops ? $(++n) : ""; - rhs_conv = cmp_ops ? $(++n) : ""; + if (cmp_ops) + { + lhs_conv = $(++n); + rhs_conv = $(++n); + } if (lhs_conv == "NONE") lhs_conv = ""; @@ -110,129 +160,223 @@ next; } + if (lhs_arg != lhs_tag || rhs_arg != rhs_tag) + next; + h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag); - result_num = rev_tag[result_tag]; + result_num_1 = rev_tag[result_tag_1]; + if (sparse) + result_num_2 = rev_tag[result_tag_2]; lhs_num = rev_tag[lhs_tag]; rhs_num = rev_tag[rhs_tag]; - result_type = type[result_num]; + result_type_1 = type[result_num_1]; + if (sparse) + result_type_2 = type[result_num_2]; lhs_type = type[lhs_num]; rhs_type = type[rhs_num]; lhs_core_type = core_type[lhs_num]; rhs_core_type = core_type[rhs_num]; - result_scalar_zero_val = scalar_zero_val[result_num]; + result_scalar_zero_val_1 = scalar_zero_val[result_num_1]; + if (sparse) + result_scalar_zero_val_2 = scalar_zero_val[result_num_2]; lhs_scalar_zero_val = scalar_zero_val[lhs_num]; rhs_scalar_zero_val = scalar_zero_val[rhs_num]; - result_header = header[result_num]; + result_header_1 = header[result_num_1]; + if (sparse) + result_header_2 = header[result_num_2]; lhs_header = header[lhs_num]; rhs_header = header[rhs_num]; lhs_class = class[lhs_num]; rhs_class = class[rhs_num]; - print "// DO NOT EDIT -- generated by mk-ops" > h_file; - - printf ("#if ! defined (%s)\n", h_guard) >> h_file; - printf ("#define %s 1\n", h_guard) >> h_file; - print "#include \"octave-config.h\"" >> h_file; - - if (result_header) - { - if (result_fwd_decl_ok) - printf ("class %s\n", result_type) >> h_file; - else - printf ("#include \"%s\"\n", result_header) >> h_file; - } - - if (lhs_header && ! (lhs_header == result_header)) - { - if (result_fwd_decl_ok) - printf ("class %s\n", lhs_type) >> h_file; - else - printf ("#include \"%s\"\n", lhs_header) >> h_file; - } - - if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header)) + if (make_header) { - if (result_fwd_decl_ok) - printf ("class %s\n", rhs_type) >> h_file; - else - printf ("#include \"%s\"\n", rhs_header) >> h_file; - } + print "// DO NOT EDIT -- generated by mk-ops.awk"; + + printf ("#if ! defined (%s)\n", h_guard); + printf ("#define %s 1\n", h_guard); + print "#include \"octave-config.h\""; + + if (result_header_1) + { + if (result_fwd_decl_ok) + printf ("class %s\n", result_type_1); + else + printf ("#include \"%s\"\n", result_header_1); + } - printf ("#include \"mx-op-decl.h\"\n") >> h_file; + if (result_header_2 && ! (result_header_2 == result_header_1)) + { + if (result_fwd_decl_ok) + printf ("class %s\n", result_type_2); + else + printf ("#include \"%s\"\n", result_header_2); + } - if (bin_ops) - printf ("%s%s_BIN_OP_DECLS (%s, %s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, result_type, lhs_type, rhs_type) >> h_file + if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) + { + if (result_fwd_decl_ok) + printf ("class %s\n", lhs_type); + else + printf ("#include \"%s\"\n", lhs_header); + } + + if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2)) + { + if (result_fwd_decl_ok) + printf ("class %s\n", rhs_type); + else + printf ("#include \"%s\"\n", rhs_header); + } - if (cmp_ops) - printf ("%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, lhs_type, rhs_type) >> h_file + if (sparse) + { + ## FIXME: it might be nice to only include the declarations + ## of the operators that are actually needed instead of + ## including all of them. + printf ("#include \"mx-ops.h\"\n"); + printf ("#include \"Sparse-op-defs.h\"\n"); + } + else + printf ("#include \"mx-op-decl.h\"\n"); + + if (bin_ops) + { + if (sparse) + printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, result_type_1, result_type_2, + lhs_type, rhs_type); + else + printf ("%s%s_BIN_OP_DECLS (%s, %s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, result_type_1, lhs_type, + rhs_type); + } - if (bool_ops) - printf ("%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, lhs_type, rhs_type) >> h_file - + if (cmp_ops) + { + if (sparse) + printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, lhs_type, rhs_type); + else + printf ("%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, lhs_type, rhs_type); + } - print "#endif" >> h_file; + if (eqne_ops) + { + if (sparse) + printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, lhs_type, rhs_type); + } - close (h_file); - + if (bool_ops) + { + if (sparse) + printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, lhs_type, rhs_type); + else + printf ("%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", + lhs_class, rhs_class, lhs_type, rhs_type); + } - print "// DO NOT EDIT -- generated by mk-ops" > cc_file; + print "#endif"; - print "#ifdef HAVE_CONFIG_H" >> cc_file; - print "#include " >> cc_file; - print "#endif" >> cc_file; + exit (0); + } + else if (make_source) + { + print "// DO NOT EDIT -- generated by mk-ops.awk"; - print "#include \"Array-util.h\"" >> cc_file; + print "#ifdef HAVE_CONFIG_H"; + print "# include "; + print "#endif"; - printf ("#include \"%s\"\n", h_file) >> cc_file; + print "#include \"Array-util.h\""; - printf ("#include \"mx-op-defs.h\"\n") >> cc_file; + printf ("#include \"%s\"\n", h_file); - for (i in bool_headers) - { - printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file; - delete bool_headers[i]; - } + if (! sparse) + printf ("#include \"mx-op-defs.h\"\n"); + + for (i in bool_headers) + { + printf ("#include \"%s\"\n", bool_headers[i]); + delete bool_headers[i]; + } - if (result_header) - printf ("#include \"%s\"\n", result_header) >> cc_file; + if (result_header_1) + printf ("#include \"%s\"\n", result_header_1); + + if (result_header_2 && ! (result_header_2 == result_header_1)) + printf ("#include \"%s\"\n", result_header_2); - if (lhs_header && ! (lhs_header == result_header)) - printf ("#include \"%s\"\n", lhs_header) >> cc_file; + if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) + printf ("#include \"%s\"\n", lhs_header); + + if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2)) + printf ("#include \"%s\"\n", rhs_header); - if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header)) - printf ("#include \"%s\"\n", rhs_header) >> cc_file; + if (bin_ops) + { + if (sparse) + printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n", + lhs_class, rhs_class, result_type_1, + result_type_2, lhs_type, rhs_type); + else + { + if ((lhs_class == "DM" && rhs_class == "M") || (lhs_class == "M" && rhs_class == "DM")) + printf ("%s%s_BIN_OPS (%s, %s, %s, %s)\n", + lhs_class, rhs_class, result_type_1, + lhs_type, rhs_type, result_scalar_zero_val_1); + else + printf ("%s%s_BIN_OPS (%s, %s, %s)\n", + lhs_class, rhs_class, result_type_1, + lhs_type, rhs_type); + } + } - if (bin_ops) - { - if ((lhs_class == "DM" && rhs_class == "M") || (lhs_class == "M" && rhs_class == "DM")) - printf ("%s%s_BIN_OPS (%s, %s, %s, %s)\n", - lhs_class, rhs_class, result_type, - lhs_type, rhs_type, result_scalar_zero_val) >> cc_file - else - printf ("%s%s_BIN_OPS (%s, %s, %s)\n", - lhs_class, rhs_class, result_type, - lhs_type, rhs_type) >> cc_file + if (cmp_ops) + { + if (sparse) + printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n", + lhs_class, rhs_class, lhs_type, + lhs_scalar_zero_val, lhs_conv, rhs_type, + rhs_scalar_zero_val, rhs_conv); + else + printf ("%s%s_CMP_OPS (%s, %s)\n", + lhs_class, rhs_class, lhs_type, rhs_type); + } + + if (eqne_ops) + { + if (sparse) + printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n", + lhs_class, rhs_class, lhs_type, + lhs_scalar_zero_val, lhs_conv, rhs_type, + rhs_scalar_zero_val, rhs_conv); + + ## No separate eqne ops for full-matrix or vector. + } + + if (bool_ops) + { + if (sparse) + printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n", + lhs_class, rhs_class, lhs_type, rhs_type, + lhs_scalar_zero_val, rhs_scalar_zero_val); + else + printf ("%s%s_BOOL_OPS (%s, %s)\n", lhs_class, rhs_class, + lhs_type, rhs_type); + } + + exit (0); } - - if (cmp_ops) - printf ("%s%s_CMP_OPS (%s, %s)\n", - lhs_class, rhs_class, lhs_type, rhs_type) >> cc_file - - if (bool_ops) - printf ("%s%s_BOOL_OPS (%s, %s)\n", lhs_class, rhs_class, - lhs_type, rhs_type) >> cc_file - - - close (cc_file); } else printf ("skipping line %d: %s\n", NR, $0); diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/module.mk --- a/liboctave/operators/module.mk Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/operators/module.mk Thu Feb 11 02:36:54 2016 -0500 @@ -11,6 +11,33 @@ $(VX_OP_SRC) \ $(SMX_OP_SRC) +BUILT_LIBOCTAVE_OPERATORS_INC = \ + liboctave/operators/mx-ops.h \ + liboctave/operators/smx-ops.h \ + liboctave/operators/vx-ops.h \ + $(MX_OP_INC) \ + $(VX_OP_INC) \ + $(SMX_OP_INC) + +BUILT_LIBOCTAVE_OPERATORS_FILES = \ + $(BUILT_LIBOCTAVE_OPERATORS_SOURCES) \ + $(BUILT_LIBOCTAVE_OPERATORS_INC) + +BUILT_FULL_MATRIX_OPERATORS_FILES = \ + liboctave/operators/mx-ops.h \ + $(MX_OP_INC) \ + $(MX_OP_SRC) + +BUILT_SPARSE_MATRIX_OPERATORS_FILES = \ + liboctave/operators/smx-ops.h \ + $(SMX_OP_INC) \ + $(SMX_OP_SRC) + +BUILT_VECTOR_OPERATORS_FILES = \ + liboctave/operators/vx-ops.h \ + $(VX_OP_INC) \ + $(VX_OP_SRC) + LIBOCTAVE_OPERATORS_INC = \ liboctave/operators/mx-base.h \ liboctave/operators/mx-defs.h \ @@ -28,38 +55,24 @@ LIBOCTAVE_TEMPLATE_SRC += \ liboctave/operators/mx-inlines.cc +## Special rules for sources which must be built before rest of compilation. + OP_SRCDIR = $(abs_top_srcdir)/liboctave/operators -define run-mx-ops - ( cd liboctave/operators; \ - $(AWK) -f $(OP_SRCDIR)/$(2)mk-ops.awk prefix=$(1) $(OP_SRCDIR)/$(1)-ops \ - ) +define run-mk-ops + rm -f $@-t $@ && \ + $(AWK) -f $(OP_SRCDIR)/mk-ops.awk -v build_file=$(notdir $@) $< > $@-t && \ + mv $@-t $@ endef -## Special rules for sources which must be built before rest of compilation. -$(VX_OP_INC) $(VX_OP_SRC) : liboctave/operators/mk-ops.awk liboctave/operators/vx-ops - $(AM_V_GEN)$(call run-mx-ops,vx) - -$(MX_OP_INC) $(MX_OP_SRC) : liboctave/operators/mk-ops.awk liboctave/operators/mx-ops - $(AM_V_GEN)$(call run-mx-ops,mx) - -$(SMX_OP_INC) $(SMX_OP_SRC) : liboctave/operators/sparse-mk-ops.awk liboctave/operators/smx-ops - $(AM_V_GEN)$(call run-mx-ops,smx,sparse-) +$(BUILT_FULL_MATRIX_OPERATORS_FILES): liboctave/operators/mx-ops liboctave/operators/mk-ops.awk + $(AM_V_GEN)$(run-mk-ops) -define run-mx-ops-inclusive - rm -f $@-t $@ && \ - $(AWK) -f $(OP_SRCDIR)/$(notdir $<) prefix=$(patsubst %-ops.h,%,$(notdir $@)) make_inclusive_header=$(notdir $@) $(OP_SRCDIR)/$(basename $(notdir $@)) > $@-t && \ - mv $@-t $@ -endef +$(BUILT_SPARSE_MATRIX_OPERATORS_FILES): liboctave/operators/smx-ops liboctave/operators/mk-ops.awk + $(AM_V_GEN)$(run-mk-ops) -liboctave/operators/vx-ops.h : liboctave/operators/mk-ops.awk liboctave/operators/vx-ops - $(AM_V_GEN)$(run-mx-ops-inclusive) - -liboctave/operators/mx-ops.h : liboctave/operators/mk-ops.awk liboctave/operators/mx-ops - $(AM_V_GEN)$(run-mx-ops-inclusive) - -liboctave/operators/smx-ops.h : liboctave/operators/sparse-mk-ops.awk liboctave/operators/smx-ops - $(AM_V_GEN)$(run-mx-ops-inclusive) +$(BUILT_VECTOR_OPERATORS_FILES): liboctave/operators/vx-ops liboctave/operators/mk-ops.awk + $(AM_V_GEN)$(run-mk-ops) noinst_LTLIBRARIES += liboctave/operators/liboperators.la @@ -78,9 +91,8 @@ liboctave_EXTRA_DIST += \ liboctave/operators/config-ops.sh \ liboctave/operators/mk-ops.awk \ - liboctave/operators/mx-ops \ - liboctave/operators/sparse-mk-ops.awk \ - liboctave/operators/smx-ops \ - liboctave/operators/vx-ops + liboctave/operators/mx-ops.cfg \ + liboctave/operators/smx-ops.cfg \ + liboctave/operators/vx-ops.cfg liboctave_DISTCLEANFILES += $(BUILT_LIBOCTAVE_OPERATORS_SOURCES) diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/mx-ops --- a/liboctave/operators/mx-ops Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/operators/mx-ops Thu Feb 11 02:36:54 2016 -0500 @@ -74,14 +74,16 @@ i64nda int64NDArray ND int64NDArray.h YES octave_int64::zero int64_t ui64nda uint64NDArray ND uint64NDArray.h YES octave_uint64::zero uint64_t pm PermMatrix PM PermMatrix.h YES static_cast(0) -# ops +# +# full-matrix operators +# # result_t lhs_t rhs_t op-type lhs_conv rhs_conv headers ... # # op-type is one of # -# B: binary ops, + - * / -# C: comparison ops, < <= == != >= > -# L: logical ops, & | +# B: binary ops, + - * / +# C: comparison ops, < <= == != >= > +# L: logical ops, & | # cdm cdm dm B cdm dm cdm B diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/smx-ops --- a/liboctave/operators/smx-ops Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/operators/smx-ops Thu Feb 11 02:36:54 2016 -0500 @@ -38,15 +38,17 @@ cs Complex S oct-cmplx.h NO 0.0 m Matrix M dMatrix.h YES 0.0 cm ComplexMatrix M CMatrix.h YES 0.0 -# ops +# +# sparse-matrix operators +# # result_t_1 result_t_2 lhs_t rhs_t op-type lhs_conv rhs_conv headers ... # # op-type is one of # -# B: binary ops, + - * / -# C: comparison ops, < <= == != >= > -# E: == != (Only one of C or E can be used!!) -# L: logical ops, & | +# B: binary ops, + - * / +# C: comparison ops, < <= == != >= > +# E: == != (Only one of C or E can be used!!) +# L: logical ops, & | # cm scm sm cs BCL NONE real boolSparse.h cm scm cs sm BCL real NONE boolSparse.h diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/sparse-mk-ops.awk --- a/liboctave/operators/sparse-mk-ops.awk Wed Feb 10 17:42:51 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -# Copyright (C) 2004-2015 John W. Eaton -# -# This file is part of Octave. -# -# Octave is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 3 of the License, or (at -# your option) any later version. -# -# Octave is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. -# -# You should have received a copy of the GNU General Public License -# along with Octave; see the file COPYING. If not, see -# . - -BEGIN { - declare_types = 0; - generate_ops = 0; - ntypes = 0; -} { - if (NR == 1 && make_inclusive_header) - { - print "// DO NOT EDIT -- generated by sparse-mk-ops"; - tmp = make_inclusive_header; - gsub (/[\.-]/, "_", tmp); - printf ("#if ! defined (octave_%s)\n", tmp); - printf ("#define octave_%s 1\n", tmp); - print "#include \"octave-config.h\""; - } -} -/^#/ { - if ($2 == "types") - declare_types = 1; - else if ($2 == "ops") - { - generate_ops = 1; - declare_types = 0; - } - next; -} { - if (declare_types) - { - ntypes++; - - if (NF == 6) - { - scalar_zero_val[ntypes] = $6; - fwd_decl_ok[ntypes] = $5 == "YES"; - header[ntypes] = $4 == "NONE" ? "" : $4; - class[ntypes] = $3; - type[ntypes] = $2; - tag[ntypes] = $1; - rev_tag[$1] = ntypes; - } - else - printf ("skipping line %d: %s\n", NR, $0); - } - else if (generate_ops) - { - if (NF >= 5) - { - result_tag_1 = $1; - result_tag_2 = $2; - lhs_tag = $3; - rhs_tag = $4; - op_type = $5; - - bin_ops = index (op_type, "B") != 0; - cmp_ops = index (op_type, "C") != 0; - eqne_ops = index (op_type, "E") != 0; - bool_ops = index (op_type, "L") != 0; - - n = 5; - - lhs_conv = cmp_ops ? $(++n) : ""; - rhs_conv = cmp_ops ? $(++n) : ""; - - if (lhs_conv == "NONE") - lhs_conv = ""; - - if (rhs_conv == "NONE") - rhs_conv = ""; - - k = 0 - while (NF > n) - bool_headers[k++] = $(++n); - - cc_file = sprintf ("%s-%s-%s.cc", prefix, lhs_tag, rhs_tag); - h_file = sprintf ("%s-%s-%s.h", prefix, lhs_tag, rhs_tag); - - if (list_cc_files) - { - printf (" liboctave/operators/%s", cc_file); - next; - } - - if (list_h_files) - { - printf (" liboctave/operators/%s", h_file); - next; - } - - if (make_inclusive_header) - { - printf ("#include \"%s\"\n", h_file); - next; - } - - h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag); - - result_num_1 = rev_tag[result_tag_1]; - result_num_2 = rev_tag[result_tag_2]; - lhs_num = rev_tag[lhs_tag]; - rhs_num = rev_tag[rhs_tag]; - - result_type_1 = type[result_num_1]; - result_type_2 = type[result_num_2]; - lhs_type = type[lhs_num]; - rhs_type = type[rhs_num]; - - result_scalar_zero_val_1 = scalar_zero_val[result_num_1]; - result_scalar_zero_val_2 = scalar_zero_val[result_num_2]; - lhs_scalar_zero_val = scalar_zero_val[lhs_num]; - rhs_scalar_zero_val = scalar_zero_val[rhs_num]; - - result_header_1 = header[result_num_1]; - result_header_2 = header[result_num_2]; - lhs_header = header[lhs_num]; - rhs_header = header[rhs_num]; - - lhs_class = class[lhs_num]; - rhs_class = class[rhs_num]; - - print "// DO NOT EDIT -- generated by sparse-mk-ops" > h_file; - - printf ("#if ! defined (%s)\n", h_guard) >> h_file; - printf ("#define %s 1\n", h_guard) >> h_file; - print "#include \"octave-config.h\"" >> h_file; - - if (result_header_1) - { - if (result_fwd_decl_ok) - printf ("class %s\n", result_type_1) >> h_file; - else - printf ("#include \"%s\"\n", result_header_1) >> h_file; - } - - if (result_header_2 && ! (result_header_2 == result_header_1)) - { - if (result_fwd_decl_ok) - printf ("class %s\n", result_type_2) >> h_file; - else - printf ("#include \"%s\"\n", result_header_2) >> h_file; - } - - if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) - { - if (result_fwd_decl_ok) - printf ("class %s\n", lhs_type) >> h_file; - else - printf ("#include \"%s\"\n", lhs_header) >> h_file; - } - - if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2)) - { - if (result_fwd_decl_ok) - printf ("class %s\n", rhs_type) >> h_file; - else - printf ("#include \"%s\"\n", rhs_header) >> h_file; - } - - ## FIXME: it might be nice to only include the declarations - ## of the operators that are actually needed instead of - ## including all of them. - printf ("#include \"mx-ops.h\"\n") >> h_file; - printf ("#include \"Sparse-op-defs.h\"\n") >> h_file; - - if (bin_ops) - printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, result_type_1, result_type_2, lhs_type, - rhs_type) >> h_file - - if (cmp_ops) - printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, lhs_type, rhs_type) >> h_file - - if (eqne_ops) - printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, lhs_type, rhs_type) >> h_file - - if (bool_ops) - printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, - rhs_class, lhs_type, rhs_type) >> h_file - - - print "#endif" >> h_file; - - close (h_file); - - - print "// DO NOT EDIT -- generated by sparse-mk-ops" > cc_file; - - ## print "#ifdef HAVE_CONFIG_H" >> cc_file; - print "#include " >> cc_file; - ## print "#endif" >> cc_file; - - print "#include \"Array-util.h\"" >> cc_file; - print "#include \"quit.h\"" >> cc_file; - - printf ("#include \"%s\"\n", h_file) >> cc_file; - - for (i in bool_headers) - { - printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file; - delete bool_headers[i]; - } - - if (result_header_1) - printf ("#include \"%s\"\n", result_header_1) >> cc_file; - - if (result_header_2 && ! (result_header_2 == result_header_1)) - printf ("#include \"%s\"\n", result_header_2) >> cc_file; - - if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) - printf ("#include \"%s\"\n", lhs_header) >> cc_file; - - if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2)) - printf ("#include \"%s\"\n", rhs_header) >> cc_file; - - if (bin_ops) - printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n", lhs_class, - rhs_class, result_type_1, result_type_2, lhs_type, - rhs_type) >> cc_file - - if (cmp_ops) - printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n", - lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val, - lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file - - if (eqne_ops) - printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n", - lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val, - lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file - - if (bool_ops) - printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n", lhs_class, - rhs_class, lhs_type, rhs_type, lhs_scalar_zero_val, - rhs_scalar_zero_val) >> cc_file - - - close (cc_file); - } - else - printf ("skipping line %d: %s\n", NR, $0); - } -} -END { - if (make_inclusive_header) - print "#endif"; -} diff -r 101489515a70 -r 7be239ae42c8 liboctave/operators/vx-ops --- a/liboctave/operators/vx-ops Wed Feb 10 17:42:51 2016 -0800 +++ b/liboctave/operators/vx-ops Thu Feb 11 02:36:54 2016 -0500 @@ -20,6 +20,14 @@ # rebuild the source file lists for Make. # types +# +# key typename object-type header fwd-decl-ok scalar-zero +# +# object-type is one of +# +# S: scalar +# V: vector +# ccv ComplexColumnVector V CColVector.h YES 0.0 crv ComplexRowVector V CRowVector.h YES 0.0 cs Complex S oct-cmplx.h NO 0.0 @@ -32,7 +40,20 @@ fcv FloatColumnVector V fColVector.h YES 0.0 frv FloatRowVector V fRowVector.h YES 0.0 fs float S NONE NO 0.0 -# ops +# +# vector operators +# +# result_t lhs_t rhs_t op-type +# +# op-type is one of +# +# B: binary ops, + - * / +# C: comparison ops, < <= == != >= > +# E: == != (Only one of C or E can be used!!) +# L: logical ops, & | +# +# though we are currently defining only binary ops for vectors. +# ccv ccv cv B ccv ccv s B crv crv rv B