6967401acb104adc8440cbc87ffdc63c26f4c20b
[scilab.git] / scilab / modules / sparse / sci_gateway / cpp / sci_sp2adj.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - Bernard HUGUENEY
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "sparse_gw.hxx"
14 #include "function.hxx"
15 #include "sparse.hxx"
16
17 extern "C"
18 {
19 #include "charEncoding.h"
20 #include "Scierror.h"
21 #include "localization.h"
22 }
23
24 using namespace types;
25
26 //[xadj,adjncy,anz]= sp2adj(
27 Function::ReturnValue sci_sp2adj(typed_list &in, int nbRes, typed_list &out)
28 {
29     Sparse *pRetVal = NULL;
30
31     if (in.size() != 1)
32     {
33         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "sp2adj", 1);
34         return Function::Error;
35     }
36
37     if (in[0]->isSparse() == false)
38     {
39         Scierror(999, _("%s: Wrong type for input argument #%d: sparse matrix expected.\n"), "sp2adj", 1);
40         return Function::Error;
41     }
42     if (nbRes > 3)
43     {
44         Scierror(999, _("%s: Wrong number of output arguments: %d to %d expected.\n"), "sp2adj", 1, 3);
45         return Function::Error;
46     }
47
48     Sparse* SPARSE_CONST sp = in[0]->getAs<Sparse>();
49     std::size_t const nonZeros = sp->nonZeros();
50
51     types::Double* res = new Double(sp->getCols() + 1, 1);
52     res->set(0, 1);
53     for (std::size_t i = 0; i != sp->getCols() ; i++)
54     {
55         res->set(static_cast<int>(i + 1), res->get(static_cast<int>(i)) + sp->nonZeros(i));
56     }
57
58     out.push_back(res);
59
60     if (nbRes >= 2)
61     {
62         res = new Double(static_cast<int>(nonZeros), 1);
63         sp->outputCols(res->getReal());
64         for (int i = 0 ; i < res->getSize() ; i++)
65         {
66             res->getReal()[i]++;
67         }
68         out.push_back(res);
69     }
70
71     if (nbRes == 3)
72     {
73         res = new Double(static_cast<int>(nonZeros), 1, sp->isComplex());
74         sp->outputValues(res->getReal(), res->getImg());
75         out.push_back(res);
76     }
77
78     return Function::OK;
79 }