Пример #1
0
/* singleton */
static VALUE rb_gsl_permutation_memcpy(VALUE obj, VALUE pp1, VALUE pp2)
{
  gsl_permutation *p1, *p2 = NULL;
  CHECK_PERMUTATION(pp1);
  CHECK_PERMUTATION(pp2);
  Data_Get_Struct(pp1, gsl_permutation, p1);
  Data_Get_Struct(pp2, gsl_permutation, p2);
  gsl_permutation_memcpy(p1, p2);
  return pp1;
}
Пример #2
0
static VALUE rb_gsl_linalg_complex_LU_refine(VALUE obj, VALUE vm,
					     VALUE lu, VALUE pp, VALUE bb,
					     VALUE xx)
{
  gsl_matrix_complex *m = NULL, *mlu = NULL;
  gsl_permutation *p = NULL;
  gsl_vector_complex *b = NULL, *x = NULL, *r = NULL;
  int flagb = 0;
  VALUE vr;

  if (CLASS_OF(obj) != cgsl_matrix_complex_LU)
    rb_raise(rb_eRuntimeError, "Decompose first!");
  CHECK_MATRIX_COMPLEX(vm);
  CHECK_MATRIX_COMPLEX(lu);
  CHECK_PERMUTATION(pp);
  CHECK_VECTOR_COMPLEX(xx);
  Data_Get_Struct(vm, gsl_matrix_complex, m);
  Data_Get_Struct(lu, gsl_matrix_complex, mlu);
  Data_Get_Struct(pp, gsl_permutation, p);
  CHECK_VECTOR_COMPLEX(bb);
  Data_Get_Struct(bb, gsl_vector_complex, b);
  Data_Get_Struct(xx, gsl_vector_complex, x);
  r = gsl_vector_complex_alloc(m->size1);
  gsl_linalg_complex_LU_refine(m, mlu, p, b, x, r);
  vr = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
  if (flagb == 1) gsl_vector_complex_free(b);
  return rb_ary_new3(2, xx, vr);
}
Пример #3
0
static VALUE rb_gsl_permutation_mul(VALUE obj, VALUE ppa, VALUE ppb)
{
  gsl_permutation *p = NULL;
  gsl_permutation *pa = NULL, *pb = NULL;
  int flag = 0;
  CHECK_PERMUTATION(ppa);
  CHECK_PERMUTATION(ppb);
  Data_Get_Struct(ppa, gsl_permutation, pa);
  Data_Get_Struct(ppb, gsl_permutation, pb);
  if (rb_obj_is_kind_of(obj, cgsl_permutation)) {
    Data_Get_Struct(obj, gsl_permutation, p);
    flag = 1;
  } else {
    p = gsl_permutation_alloc(pa->size);
  }
  gsl_permutation_mul(p, pa, pb);
  if (flag == 1) return obj;
  else return Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
}
Пример #4
0
static VALUE rb_gsl_vector_permute_inverse(VALUE obj, VALUE pp)
{
  gsl_permutation *p = NULL;
  gsl_vector *v = NULL;
  int status;
  CHECK_PERMUTATION(pp);
  Data_Get_Struct(pp, gsl_permutation, p);
  Data_Get_Struct(obj, gsl_vector, v);
  status = gsl_permute_vector_inverse(p, v);
  return INT2FIX(status);
}
Пример #5
0
static VALUE rb_gsl_permutation_equal(VALUE obj, VALUE other)
{
  gsl_permutation *p1 = NULL, *p2 = NULL;
  size_t i;
  CHECK_PERMUTATION(other);
  Data_Get_Struct(obj, gsl_permutation, p1);
  Data_Get_Struct(other, gsl_permutation, p2);
  if (p1->size != p2->size) return Qfalse;
  for (i = 0; i < p1->size; i++)
    if (p1->data[i] != p2->data[i]) return Qfalse;
  return Qtrue;
}
Пример #6
0
VALUE rb_gsl_linalg_complex_LU_decomp(int argc, VALUE *argv, VALUE obj)
{
  gsl_matrix_complex *m = NULL;
  gsl_permutation *p = NULL;
  int signum, itmp;
  size_t size;
  VALUE obj2;

  switch (TYPE(obj)) {
  case T_MODULE:
  case T_CLASS:
  case T_OBJECT:
    if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
			    argc);
    CHECK_MATRIX_COMPLEX(argv[0]);
    Data_Get_Struct(argv[0], gsl_matrix_complex, m);
    itmp = 1;
    break;
  default:
    CHECK_MATRIX_COMPLEX(obj);
    Data_Get_Struct(obj, gsl_matrix_complex, m);
    itmp = 0;
  }
  size = m->size1;
  switch (argc-itmp) {
  case 0:
    p = gsl_permutation_alloc(size);
    gsl_linalg_complex_LU_decomp(m, p, &signum);
    if (itmp == 1) rb_obj_reveal(argv[0], cgsl_matrix_complex_LU);
    else rb_obj_reveal(obj, cgsl_matrix_complex_LU);
    obj2 = Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
    return rb_ary_new3(2, obj2, INT2FIX(signum));
    break;
  case 1:  /* when a permutation object is given */
    CHECK_PERMUTATION(argv[itmp]);
    Data_Get_Struct(argv[itmp], gsl_permutation, p);
    gsl_linalg_complex_LU_decomp(m, p, &signum);
    if (itmp == 1) rb_obj_reveal(argv[0], cgsl_matrix_complex_LU);
    else rb_obj_reveal(obj, cgsl_matrix_complex_LU);
    return INT2FIX(signum);
    break;
  default:
    rb_raise(rb_eArgError, "Usage: LU_decomp!() or LU_decomp!(permutation)");
  }
}
Пример #7
0
static VALUE rb_gsl_permutation_canonical_to_linear(int argc, VALUE *argv, VALUE obj)
{
  gsl_permutation *p, *q;

  Data_Get_Struct(obj, gsl_permutation, p);
  switch (argc) {
  case 0:
    q = gsl_permutation_alloc(p->size);
    gsl_permutation_canonical_to_linear(q, p);
    return Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, q);
    break;
  case 1:
    CHECK_PERMUTATION(argv[0]);
    Data_Get_Struct(argv[0], gsl_permutation, q);
    gsl_permutation_canonical_to_linear(q, p);
    return obj;
    break;
  default:
    rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
  }
  return Qtrue;
}