1
1
#include "Rcommon.h"
2
2
#include "eaf.h"
3
3
4
- #define DECLARE_CALL (RET_TYPE , NAME , ...) \
5
- extern RET_TYPE NAME(__VA_ARGS__);
4
+ #define DECLARE_CALL (NAME , ...) extern SEXP NAME(__VA_ARGS__);
6
5
#include "init.h"
7
6
#undef DECLARE_CALL
8
7
@@ -52,8 +51,7 @@ compute_eaf_C(SEXP DATA, SEXP CUMSIZES, SEXP PERCENTILE)
52
51
eaf_t * * eaf = compute_eaf_helper (DATA , nobj , cumsizes , nruns , percentile , nlevels );
53
52
int totalpoints = eaf_totalpoints (eaf , nlevels );
54
53
55
- SEXP mat ;
56
- PROTECT (mat = Rf_allocMatrix (REALSXP , totalpoints , nobj + 1 ));
54
+ SEXP mat = PROTECT (Rf_allocMatrix (REALSXP , totalpoints , nobj + 1 ));
57
55
eaf2matrix_R (REAL (mat ), eaf , nobj , totalpoints , percentile , nlevels );
58
56
eaf_free (eaf , nlevels );
59
57
UNPROTECT (1 );
@@ -271,8 +269,7 @@ R_read_datasets(SEXP FILENAME)
271
269
const int ntotal = cumsizes [nruns - 1 ];
272
270
273
271
/* FIXME: Is this the fastest way to transfer a matrix from C to R ? */
274
- SEXP DATA ;
275
- PROTECT (DATA = Rf_allocMatrix (REALSXP , ntotal , nobj + 1 ));
272
+ SEXP DATA = PROTECT (Rf_allocMatrix (REALSXP , ntotal , nobj + 1 ));
276
273
double * rdata = REAL (DATA );
277
274
matrix_transpose_double (rdata , data , ntotal , nobj );
278
275
@@ -290,7 +287,7 @@ R_read_datasets(SEXP FILENAME)
290
287
291
288
#include "nondominated.h"
292
289
293
- void
290
+ SEXP
294
291
normalise_C (SEXP DATA , SEXP RANGE , SEXP LBOUND , SEXP UBOUND , SEXP MAXIMISE )
295
292
{
296
293
int nprotected = 0 ;
@@ -310,6 +307,7 @@ normalise_C(SEXP DATA, SEXP RANGE, SEXP LBOUND, SEXP UBOUND, SEXP MAXIMISE)
310
307
lbound , ubound );
311
308
free (maximise );
312
309
UNPROTECT (nprotected );
310
+ return R_NilValue ;
313
311
}
314
312
315
313
SEXP
@@ -356,15 +354,12 @@ pareto_ranking_C(SEXP DATA)
356
354
SEXP
357
355
hypervolume_C (SEXP DATA , SEXP REFERENCE )
358
356
{
359
- int nprotected = 0 ;
360
357
/* We transpose the matrix before calling this function. */
361
358
SEXP_2_DOUBLE_MATRIX (DATA , data , nobj , npoint );
362
359
SEXP_2_DOUBLE_VECTOR (REFERENCE , reference , reference_len );
363
360
assert (nobj == reference_len );
364
- new_real_vector (hv , 1 );
365
- hv [0 ] = fpli_hv (data , nobj , npoint , reference );
366
- UNPROTECT (nprotected );
367
- return Rexp (hv );
361
+ double hv = fpli_hv (data , nobj , npoint , reference );
362
+ return Rf_ScalarReal (hv );
368
363
}
369
364
370
365
SEXP
@@ -385,20 +380,16 @@ hv_contributions_C(SEXP DATA, SEXP REFERENCE)
385
380
SEXP
386
381
rect_weighted_hv2d_C (SEXP DATA , SEXP RECTANGLES )
387
382
{
388
- int nprotected = 0 ;
389
383
/* We transpose the matrix before calling this function. */
390
384
SEXP_2_DOUBLE_MATRIX (DATA , data , nobj , npoint );
391
385
SEXP_2_DOUBLE_MATRIX (RECTANGLES , rectangles , unused , rectangles_nrow );
392
- new_real_vector (hv , 1 );
393
- hv [0 ] = rect_weighted_hv2d (data , npoint , rectangles , rectangles_nrow );
394
- UNPROTECT (nprotected );
395
- return Rexp (hv );
386
+ double hv = rect_weighted_hv2d (data , npoint , rectangles , rectangles_nrow );
387
+ return Rf_ScalarReal (hv );
396
388
}
397
389
398
390
SEXP
399
391
preprocess_rectangles_C (SEXP RECTANGLES , SEXP REFERENCE )
400
392
{
401
- int nprotected = 0 ;
402
393
/* We transpose the matrix before calling this function. */
403
394
SEXP_2_DOUBLE_MATRIX (RECTANGLES , rectangles , ncol , nrow );
404
395
SEXP_2_DOUBLE_VECTOR (REFERENCE , reference , reference_len );
@@ -411,7 +402,7 @@ preprocess_rectangles_C(SEXP RECTANGLES, SEXP REFERENCE)
411
402
rectangles [k * ncol + 3 ] = MIN (rectangles [k * ncol + 3 ], reference [1 ]);
412
403
}
413
404
int skip_nrow = 0 ;
414
- int * skip = (int * ) malloc (nrow * sizeof (int ));
405
+ int * skip = (int * ) R_alloc (nrow , sizeof (int ));
415
406
for (int k = 0 ; k < nrow ; k ++ ) {
416
407
bool empty = (rectangles [k * ncol + 0 ] == rectangles [k * ncol + 2 ]
417
408
|| rectangles [k * ncol + 1 ] == rectangles [k * ncol + 3 ]);
@@ -420,8 +411,6 @@ preprocess_rectangles_C(SEXP RECTANGLES, SEXP REFERENCE)
420
411
}
421
412
422
413
if (skip_nrow == 0 ) {
423
- free (skip );
424
- UNPROTECT (nprotected );
425
414
return RECTANGLES ;
426
415
}
427
416
int new_nrow = nrow - skip_nrow ;
@@ -440,8 +429,7 @@ preprocess_rectangles_C(SEXP RECTANGLES, SEXP REFERENCE)
440
429
k = skip [s ] + 1 ;
441
430
}
442
431
}
443
- free (skip );
444
- UNPROTECT (nprotected + 1 );
432
+ UNPROTECT (1 );
445
433
return R_dest ;
446
434
}
447
435
@@ -450,7 +438,6 @@ preprocess_rectangles_C(SEXP RECTANGLES, SEXP REFERENCE)
450
438
SEXP
451
439
whv_hype_C (SEXP DATA , SEXP IDEAL , SEXP REFERENCE , SEXP NSAMPLES , SEXP DIST , SEXP SEED , SEXP MU )
452
440
{
453
- int nprotected = 0 ;
454
441
SEXP_2_DOUBLE_MATRIX (DATA , data , nobj , npoints );
455
442
SEXP_2_DOUBLE_VECTOR (IDEAL , ideal , ideal_len );
456
443
SEXP_2_DOUBLE_VECTOR (REFERENCE , reference , reference_len );
@@ -460,20 +447,19 @@ whv_hype_C(SEXP DATA, SEXP IDEAL, SEXP REFERENCE, SEXP NSAMPLES, SEXP DIST, SEXP
460
447
SEXP_2_STRING (DIST , dist_type );
461
448
SEXP_2_UINT32 (SEED , seed );
462
449
463
- new_real_vector ( hv , 1 ) ;
450
+ double hv ;
464
451
if (0 == strcmp (dist_type , "uniform" )) {
465
- hv [ 0 ] = whv_hype_unif (data , npoints , ideal , reference , nsamples , seed );
452
+ hv = whv_hype_unif (data , npoints , ideal , reference , nsamples , seed );
466
453
} else if (0 == strcmp (dist_type , "exponential" )) {
467
454
const double * mu = REAL (MU );
468
- hv [ 0 ] = whv_hype_expo (data , npoints , ideal , reference , nsamples , seed , mu [0 ]);
455
+ hv = whv_hype_expo (data , npoints , ideal , reference , nsamples , seed , mu [0 ]);
469
456
} else if (0 == strcmp (dist_type , "point" )) {
470
457
const double * mu = REAL (MU );
471
- hv [ 0 ] = whv_hype_gaus (data , npoints , ideal , reference , nsamples , seed , mu );
458
+ hv = whv_hype_gaus (data , npoints , ideal , reference , nsamples , seed , mu );
472
459
} else {
473
460
Rf_error ("unknown 'dist' value: %s" , dist_type );
474
461
}
475
- UNPROTECT (nprotected );
476
- return Rexp (hv );
462
+ return Rf_ScalarReal (hv );
477
463
}
478
464
479
465
#include "epsilon.h"
@@ -492,7 +478,6 @@ static inline SEXP
492
478
unary_metric_ref (SEXP DATA , SEXP REFERENCE , SEXP MAXIMISE ,
493
479
enum unary_metric_t metric , SEXP EXTRA )
494
480
{
495
- int nprotected = 0 ;
496
481
/* We transpose the matrix before calling this function. */
497
482
SEXP_2_DOUBLE_MATRIX (DATA , data , nobj , npoint );
498
483
double * ref = REAL (REFERENCE );
@@ -501,32 +486,31 @@ unary_metric_ref(SEXP DATA, SEXP REFERENCE, SEXP MAXIMISE,
501
486
SEXP_2_LOGICAL_BOOL_VECTOR (MAXIMISE , maximise , maximise_len );
502
487
assert (nobj == maximise_len );
503
488
504
- new_real_vector ( value , 1 ) ;
489
+ double value ;
505
490
switch (metric ) {
506
491
case EPSILON_ADD :
507
- value [ 0 ] = epsilon_additive (data , nobj , npoint , ref , ref_size , maximise );
492
+ value = epsilon_additive (data , nobj , npoint , ref , ref_size , maximise );
508
493
break ;
509
494
case EPSILON_MUL :
510
- value [ 0 ] = epsilon_mult (data , nobj , npoint , ref , ref_size , maximise );
495
+ value = epsilon_mult (data , nobj , npoint , ref , ref_size , maximise );
511
496
break ;
512
497
case INV_GD :
513
- value [ 0 ] = IGD (data , nobj , npoint , ref , ref_size , maximise );
498
+ value = IGD (data , nobj , npoint , ref , ref_size , maximise );
514
499
break ;
515
500
case INV_GDPLUS :
516
- value [ 0 ] = IGD_plus (data , nobj , npoint , ref , ref_size , maximise );
501
+ value = IGD_plus (data , nobj , npoint , ref , ref_size , maximise );
517
502
break ;
518
503
case AVG_HAUSDORFF : {
519
504
SEXP_2_INT (EXTRA , p );
520
- value [ 0 ] = avg_Hausdorff_dist (data , nobj , npoint , ref , ref_size , maximise , p );
505
+ value = avg_Hausdorff_dist (data , nobj , npoint , ref , ref_size , maximise , p );
521
506
break ;
522
507
}
523
508
default :
524
509
Rf_error ("unknown unary metric" );
525
510
}
526
511
527
512
free (maximise );
528
- UNPROTECT (nprotected );
529
- return Rexp (value );
513
+ return Rf_ScalarReal (value );
530
514
}
531
515
532
516
SEXP
0 commit comments