From: David B. <ad...@us...> - 2004-07-26 14:56:22
|
Update of /cvsroot/octave/octave-forge/main/comm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20947/main/comm Modified Files: Makefile galois-ops.h galois.cc galois.h op-gm-gm.cc op-gm-m.cc op-gm-s.cc op-m-gm.cc op-s-gm.cc ov-galois.cc ov-galois.h Log Message: Add user type concatenation to galois and fixed point types Index: galois-ops.h =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/galois-ops.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- galois-ops.h 6 Feb 2003 05:14:59 -0000 1.1 +++ galois-ops.h 26 Jul 2004 14:55:38 -0000 1.2 @@ -102,6 +102,22 @@ return new octave_galois (f (v1.t1 ## _value (), v2.matrix_value ())); \ } +#ifdef HAVE_OCTAVE_CONCAT +#define DEFCATOP_G_FN(name, t1, t2, f) \ + CATOPDECL (name, a1, a2) \ + { \ + CAST_BINOP_ARGS (const octave_ ## t1&, const octave_ ## t2&); \ + return new octave_galois (f (v1.t1 ## _value (), v2.t2 ## _value (), ra_idx)); \ + } + +#define INSTALL_G_CATOP(t1, t2, f) INSTALL_CATOP(t1, t2, f) +#else +#define DEFCATOP_G_FN(name, t1, t2, f) +#define INSTALL_G_CATOP(t1, t2, f) +#endif + + + #endif /* Index: ov-galois.h =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/ov-galois.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- ov-galois.h 15 Mar 2004 22:23:01 -0000 1.5 +++ ov-galois.h 26 Jul 2004 14:55:38 -0000 1.6 @@ -33,6 +33,11 @@ #include <iostream> #include <string> + +#ifdef HAVE_OCTAVE_CONCAT +#include <octave/dim-vector.h> +#endif + #include "galois.h" #ifdef HAVE_SLLIST_H @@ -106,6 +111,12 @@ } #endif +#ifdef HAVE_OCTAVE_CONCAT + octave_value resize (const dim_vector& dv) const; + + size_t byte_size (void) const { return gval.byte_size (); } +#endif + octave_value all (int dim = 0) const { return gval.all(dim); } octave_value any (int dim = 0) const { return gval.any(dim); } Index: galois.h =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/galois.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- galois.h 12 Sep 2003 14:22:42 -0000 1.5 +++ galois.h 26 Jul 2004 14:55:38 -0000 1.6 @@ -92,6 +92,17 @@ boolMatrix all (int dim = -1) const; boolMatrix any (int dim = -1) const; +#ifdef HAVE_OCTAVE_CONCAT + friend galois concat (const galois& ra, const galois& rb, + const Array<int>& ra_idx); + friend galois concat (const galois& ra, const Matrix& rb, + const Array<int>& ra_idx); + friend galois concat (const Matrix& ra, const galois& rb, + const Array<int>& ra_idx); + + galois& insert (const galois& a, int r, int c); +#endif + galois diag (void) const; galois diag (int k) const; Index: Makefile =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/Makefile,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- Makefile 7 Jul 2004 09:38:43 -0000 1.25 +++ Makefile 26 Jul 2004 14:55:38 -0000 1.26 @@ -29,7 +29,7 @@ DELETES = $(OBJECTS) $(GALOISDEPENDS) $(OTHERDPENDS) *~ $(TARGETS) core octave-core -DEFINES = -DGALOIS_DISP_PRIVATES $(HAVE_DO_FORTRAN_INDEXING) $(HAVE_PROPAGATE_EMPTY_MATRICES) $(HAVE_ND_ARRAYS) $(TYPEID_HAS_CLASS) $(CLASS_HAS_LOAD_SAVE) +DEFINES = -DGALOIS_DISP_PRIVATES $(HAVE_DO_FORTRAN_INDEXING) $(HAVE_PROPAGATE_EMPTY_MATRICES) $(HAVE_ND_ARRAYS) $(TYPEID_HAS_CLASS) $(CLASS_HAS_LOAD_SAVE) $(HAVE_OCTAVE_CONCAT) MOFLAGS = .PHONY: all dist clean realclean count $(SUBDIRS) @@ -68,7 +68,7 @@ $(MKOCTFILE) $(MOFLAGS) $(DEFINES) -M $< %.o:%.cc - echo "Compiling $@"; \ + @echo "Compiling $@"; \ $(MKOCTFILE) $(MOFLAGS) $(DEFINES) -c $< clean: $(SUBDIRS) Index: op-gm-m.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/op-gm-m.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- op-gm-m.cc 6 Feb 2003 05:14:59 -0000 1.1 +++ op-gm-m.cc 26 Jul 2004 14:55:38 -0000 1.2 @@ -68,6 +68,8 @@ DEFBINOP_FN (el_and, galois, matrix, mx_el_and) DEFBINOP_FN (el_or, galois, matrix, mx_el_or) +DEFCATOP_G_FN (gm_m, galois, matrix, concat) + // Need to create temporary Galois array so that matrix values are checked DEFASSIGNOP (assign, galois, matrix) { @@ -100,6 +102,8 @@ INSTALL_BINOP (op_el_and, octave_galois, octave_matrix, el_and); INSTALL_BINOP (op_el_or, octave_galois, octave_matrix, el_or); + INSTALL_G_CATOP (octave_galois, octave_matrix, gm_m); + INSTALL_ASSIGNOP (op_asn_eq, octave_galois, octave_matrix, assign); INSTALL_ASSIGNCONV (octave_base_value, octave_galois, octave_matrix); } Index: op-gm-s.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/op-gm-s.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- op-gm-s.cc 6 Feb 2003 05:14:59 -0000 1.1 +++ op-gm-s.cc 26 Jul 2004 14:55:38 -0000 1.2 @@ -68,6 +68,13 @@ DEFBINOP_FN_B_S2 (el_and, galois, scalar, mx_el_and) DEFBINOP_FN_B_S2 (el_or, galois, scalar, mx_el_or) +DEFCATOP (gm_s, galois, scalar) +{ + CAST_BINOP_ARGS (const octave_galois&, const octave_scalar&); + return new octave_galois (concat (v1.galois_value (), v2.matrix_value (), + ra_idx)); +} + DEFASSIGNOP(assign, galois, scalar) { CAST_BINOP_ARGS (octave_galois&, const octave_scalar&); @@ -99,6 +106,8 @@ INSTALL_BINOP (op_el_and, octave_galois, octave_scalar, el_and); INSTALL_BINOP (op_el_or, octave_galois, octave_scalar, el_or); + INSTALL_G_CATOP (octave_galois, octave_scalar, gm_s); + INSTALL_ASSIGNOP (op_asn_eq, octave_galois, octave_scalar, assign); } Index: galois.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/galois.cc,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- galois.cc 7 Jan 2004 14:24:59 -0000 1.6 +++ galois.cc 26 Jul 2004 14:55:38 -0000 1.7 @@ -46,10 +46,6 @@ gripe_range_galois(_m); return; } - if ((a(i,j) - (double)((int)a(i,j))) != 0.) { - gripe_integer_galois(); - return; - } xelem(i,j) = (int)a(i,j); } } @@ -87,10 +83,6 @@ return; } - for (int i=0; i<rows(); i++) - for (int j=0; j<columns(); j++) - xelem(i,j) = val; - field = stored_galois_fields.create_galois_field(_m, _primpoly); } @@ -108,10 +100,6 @@ return; } - for (int i=0; i<rows(); i++) - for (int j=0; j<columns(); j++) - xelem(i,j) = (int)val; - field = stored_galois_fields.create_galois_field(_m, _primpoly); } @@ -126,7 +114,6 @@ // This call to create_galois_field will just increment the usage counter field = stored_galois_fields.create_galois_field(a.m(), a.primpoly()); - } galois :: ~galois (void) @@ -238,6 +225,98 @@ return retval; } +#ifdef HAVE_OCTAVE_CONCAT +galois concat (const galois& ra, const galois& rb, const Array<int>& ra_idx) +{ + galois retval (ra); + if (ra.numel() > 0) + retval.insert (rb, ra_idx(0), ra_idx(1)); + return retval; +} + +galois concat (const galois& ra, const Matrix& rb, const Array<int>& ra_idx) +{ + galois retval (ra); + if (ra.numel() == 1) + return retval; + + galois tmp (0, 0, 0, ra.m(), ra.primpoly()); + int _n = (1<<ra.m()) - 1; + int r = rb.rows(); + int c = rb.columns(); + tmp.resize (r, c); + + // Check the validity of the data in the matrix + for (int i=0; i<r; i++) { + for (int j=0; j<c; j++) { + if ((rb(i,j) < 0) || (rb(i,j) > _n)) { + gripe_range_galois(ra.m()); + return retval; + } + if ((rb(i,j) - (double)((int)rb(i,j))) != 0.) { + gripe_integer_galois(); + return retval; + } + tmp(i,j) = (int)rb(i,j); + } + } + + retval.insert (tmp, ra_idx(0), ra_idx(1)); + return retval; +} + +galois concat (const Matrix& ra, const galois& rb, const Array<int>& ra_idx) +{ + galois retval (0, 0, 0, rb.m(), rb.primpoly()); + int _n = (1<<rb.m()) - 1; + int r = ra.rows(); + int c = ra.columns(); + retval.resize (r, c); + if (ra.numel() < 1) + return retval; + + // XXX FIXME XXX + // Check the validity of the data in the matrix. This is problematic + // as "ra" is not initialized on the initial resize and so contains + // random data that will be replaced. Humm, disable for now + for (int i=0; i<r; i++) { + for (int j=0; j<c; j++) { +#if 0 + if ((ra(i,j) < 0) || (ra(i,j) > _n)) { + gripe_range_galois(rb.m()); + return retval; + } + if ((ra(i,j) - (double)((int)ra(i,j))) != 0.) { + gripe_integer_galois(); + return retval; + } + retval(i,j) = (int)ra(i,j); +#else + int tmp = (int)ra(i,j); + if (tmp < 0) + retval(i,j) = 0; + else if (tmp > _n) + retval(i,j) = _n; + else + retval(i,j) = tmp; +#endif + } + } + + retval.insert (rb, ra_idx(0), ra_idx(1)); + return retval; +} + +galois& galois::insert (const galois& t, int r, int c) +{ + if ((m() != t.m()) || (primpoly() != t.primpoly())) + (*current_liboctave_error_handler) ("inserted galois variable must be in the same field"); + else + Array<int>::insert (t, r, c); + return *this; +} +#endif + galois galois::diag (void) const { return diag(0); Index: op-gm-gm.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/op-gm-gm.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- op-gm-gm.cc 17 Oct 2003 21:59:12 -0000 1.2 +++ op-gm-gm.cc 26 Jul 2004 14:55:38 -0000 1.3 @@ -80,6 +80,8 @@ DEFBINOP_FN (el_and, galois, galois, mx_el_and) DEFBINOP_FN (el_or, galois, galois, mx_el_or) +DEFCATOP_G_FN (gm_gm, galois, galois, concat) + DEFASSIGNOP_FN (assign, galois, galois, assign) void @@ -109,6 +111,8 @@ INSTALL_BINOP (op_el_and, octave_galois, octave_galois, el_and); INSTALL_BINOP (op_el_or, octave_galois, octave_galois, el_or); + INSTALL_G_CATOP (octave_galois, octave_galois, gm_gm); + INSTALL_ASSIGNOP (op_asn_eq, octave_galois, octave_galois, assign); } Index: op-s-gm.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/op-s-gm.cc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- op-s-gm.cc 6 Feb 2003 05:14:59 -0000 1.1 +++ op-s-gm.cc 26 Jul 2004 14:55:38 -0000 1.2 @@ -81,6 +81,13 @@ DEFBINOP_FN_B_S1 (el_and, scalar, galois, mx_el_and) DEFBINOP_FN_B_S1 (el_or, scalar, galois, mx_el_or) +DEFCATOP (s_gm, scalar, galois) +{ + CAST_BINOP_ARGS (const octave_scalar&, const octave_galois&); + return new octave_galois (concat (v1.matrix_value (), v2.galois_value (), + ra_idx)); +} + void install_s_gm_ops (void) { @@ -103,6 +110,8 @@ INSTALL_BINOP (op_el_and, octave_scalar, octave_galois, el_and); INSTALL_BINOP (op_el_or, octave_scalar, octave_galois, el_or); + INSTALL_G_CATOP (octave_scalar, octave_galois, s_gm); + INSTALL_ASSIGNCONV (octave_scalar, octave_galois, octave_galois); } Index: ov-galois.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/ov-galois.cc,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- ov-galois.cc 15 Mar 2004 22:23:01 -0000 1.10 +++ ov-galois.cc 26 Jul 2004 14:55:38 -0000 1.11 @@ -55,6 +55,21 @@ DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_galois, "galois"); #endif + +#ifdef HAVE_OCTAVE_CONCAT +octave_value octave_galois::resize (const dim_vector& dv) const +{ + if (dv.length() > 2) + { + error ("Can not resize galois structure to NDArray"); + return octave_value (); + } + galois retval (gval); + retval.resize (dv(0), dv(1)); + return new octave_galois (retval); +} +#endif + octave_value_list octave_galois::dotref (const octave_value_list& idx) { Index: op-m-gm.cc =================================================================== RCS file: /cvsroot/octave/octave-forge/main/comm/op-m-gm.cc,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- op-m-gm.cc 17 Oct 2003 21:59:12 -0000 1.2 +++ op-m-gm.cc 26 Jul 2004 14:55:38 -0000 1.3 @@ -77,6 +77,8 @@ DEFBINOP_FN (el_and, matrix, galois, mx_el_and) DEFBINOP_FN (el_or, matrix, galois, mx_el_or) +DEFCATOP_G_FN (m_gm, matrix, galois, concat) + DEFASSIGNOP_FN (assign, matrix, galois, assign) void @@ -101,6 +103,8 @@ INSTALL_BINOP (op_el_and, octave_matrix, octave_galois, el_and); INSTALL_BINOP (op_el_or, octave_matrix, octave_galois, el_or); + INSTALL_G_CATOP (octave_matrix, octave_galois, m_gm); + INSTALL_ASSIGNOP (op_asn_eq, octave_matrix, octave_galois, assign); //INSTALL_ASSIGNCONV (octave_base_value, octave_matrix, octave_galois); } |