@@ -65,7 +65,6 @@ void THCTensor_(clearFlag)(THCState *state, THCTensor *self, const char flag)
6565/**** creation methods ****/
6666
6767static void THCTensor_ (rawInit )(THCState * state , THCTensor * self );
68- static void THCTensor_ (rawSet )(THCState * state , THCTensor * self , THCStorage * storage , ptrdiff_t storageOffset , int nDimension , long * size , long * stride );
6968
7069
7170/* Empty init */
@@ -81,13 +80,13 @@ THCTensor *THCTensor_(newWithTensor)(THCState *state, THCTensor *tensor)
8180{
8281 THCTensor * self = (THCTensor * )THAlloc (sizeof (THCTensor ));
8382 THCTensor_ (rawInit )(state , self );
84- THCTensor_ (rawSet )(state ,
85- self ,
86- tensor -> storage ,
87- tensor -> storageOffset ,
88- tensor -> nDimension ,
89- tensor -> size ,
90- tensor -> stride );
83+ THCTensor_ (setStorageNd )(state ,
84+ self ,
85+ tensor -> storage ,
86+ tensor -> storageOffset ,
87+ tensor -> nDimension ,
88+ tensor -> size ,
89+ tensor -> stride );
9190 return self ;
9291}
9392
@@ -99,13 +98,13 @@ THCTensor *THCTensor_(newWithStorage)(THCState *state, THCStorage *storage, ptrd
9998 THArgCheck (size -> size == stride -> size , 4 , "inconsistent size" );
10099
101100 THCTensor_ (rawInit )(state , self );
102- THCTensor_ (rawSet )(state ,
103- self ,
104- storage ,
105- storageOffset ,
106- (size ? size -> size : (stride ? stride -> size : 0 )),
107- (size ? size -> data : NULL ),
108- (stride ? stride -> data : NULL ));
101+ THCTensor_ (setStorageNd )(state ,
102+ self ,
103+ storage ,
104+ storageOffset ,
105+ (size ? size -> size : (stride ? stride -> size : 0 )),
106+ (size ? size -> data : NULL ),
107+ (stride ? stride -> data : NULL ));
109108
110109 return self ;
111110}
@@ -141,7 +140,7 @@ THCTensor *THCTensor_(newWithStorage4d)(THCState *state, THCStorage *storage, pt
141140
142141 THCTensor * self = (THCTensor * )THAlloc (sizeof (THCTensor ));
143142 THCTensor_ (rawInit )(state , self );
144- THCTensor_ (rawSet )(state , self , storage , storageOffset , 4 , size , stride );
143+ THCTensor_ (setStorageNd )(state , self , storage , storageOffset , 4 , size , stride );
145144
146145 return self ;
147146}
@@ -172,7 +171,7 @@ THCTensor *THCTensor_(newWithSize4d)(THCState *state, long size0, long size1, lo
172171
173172 THCTensor * self = (THCTensor * )THAlloc (sizeof (THCTensor ));
174173 THCTensor_ (rawInit )(state , self );
175- THCTensor_ (rawResize )(state , self , 4 , size , NULL );
174+ THCTensor_ (resizeNd )(state , self , 4 , size , NULL );
176175
177176 return self ;
178177}
@@ -224,14 +223,25 @@ THCTensor *THCTensor_(newUnfold)(THCState *state, THCTensor *tensor, int dimensi
224223 return self ;
225224}
226225
226+ THCTensor * THCTensor_ (newView )(THCState * state , THCTensor * tensor , THLongStorage * size )
227+ {
228+ THArgCheck (THCTensor_ (isContiguous )(state , tensor ), 2 , "input is not contiguous" );
229+ ptrdiff_t numel = THCTensor_ (nElement )(state , tensor );
230+ THCTensor * self = THCTensor_ (new )(state );
231+ THLongStorage * inferred_size = THLongStorage_newInferSize (size , numel );
232+ THCTensor_ (setStorage )(state , self , tensor -> storage , tensor -> storageOffset , inferred_size , NULL );
233+ THLongStorage_free (inferred_size );
234+ return self ;
235+ }
236+
227237/* Resize */
228238void THCTensor_ (resize )(THCState * state , THCTensor * self , THLongStorage * size , THLongStorage * stride )
229239{
230240 THArgCheck (size != NULL , 2 , "invalid size" );
231241 if (stride )
232242 THArgCheck (stride -> size == size -> size , 3 , "invalid stride" );
233243
234- THCTensor_ (rawResize )(state , self , size -> size , size -> data , (stride ? stride -> data : NULL ));
244+ THCTensor_ (resizeNd )(state , self , size -> size , size -> data , (stride ? stride -> data : NULL ));
235245}
236246
237247void THCTensor_ (resizeAs )(THCState * state , THCTensor * self , THCTensor * src )
@@ -252,7 +262,7 @@ void THCTensor_(resizeAs)(THCState *state, THCTensor *self, THCTensor *src)
252262 }
253263
254264 if (!isSame )
255- THCTensor_ (rawResize )(state , self , src -> nDimension , src -> size , NULL );
265+ THCTensor_ (resizeNd )(state , self , src -> nDimension , src -> size , NULL );
256266}
257267
258268void THCTensor_ (resize1d )(THCState * state , THCTensor * tensor , long size0 )
@@ -274,40 +284,40 @@ void THCTensor_(resize4d)(THCState *state, THCTensor *self, long size0, long siz
274284{
275285 long size [4 ] = {size0 , size1 , size2 , size3 };
276286
277- THCTensor_ (rawResize )(state , self , 4 , size , NULL );
287+ THCTensor_ (resizeNd )(state , self , 4 , size , NULL );
278288}
279289
280290void THCTensor_ (resize5d )(THCState * state , THCTensor * self , long size0 , long size1 , long size2 , long size3 , long size4 )
281291{
282292 long size [5 ] = {size0 , size1 , size2 , size3 , size4 };
283293
284- THCTensor_ (rawResize )(state , self , 5 , size , NULL );
294+ THCTensor_ (resizeNd )(state , self , 5 , size , NULL );
285295}
286296
287297void THCTensor_ (set )(THCState * state , THCTensor * self , THCTensor * src )
288298{
289299 if (self != src )
290- THCTensor_ (rawSet )(state ,
291- self ,
292- src -> storage ,
293- src -> storageOffset ,
294- src -> nDimension ,
295- src -> size ,
296- src -> stride );
300+ THCTensor_ (setStorageNd )(state ,
301+ self ,
302+ src -> storage ,
303+ src -> storageOffset ,
304+ src -> nDimension ,
305+ src -> size ,
306+ src -> stride );
297307}
298308
299309void THCTensor_ (setStorage )(THCState * state , THCTensor * self , THCStorage * storage_ , ptrdiff_t storageOffset_ , THLongStorage * size_ , THLongStorage * stride_ )
300310{
301311 if (size_ && stride_ )
302312 THArgCheck (size_ -> size == stride_ -> size , 5 , "inconsistent size/stride sizes" );
303313
304- THCTensor_ (rawSet )(state ,
305- self ,
306- storage_ ,
307- storageOffset_ ,
308- (size_ ? size_ -> size : (stride_ ? stride_ -> size : 0 )),
309- (size_ ? size_ -> data : NULL ),
310- (stride_ ? stride_ -> data : NULL ));
314+ THCTensor_ (setStorageNd )(state ,
315+ self ,
316+ storage_ ,
317+ storageOffset_ ,
318+ (size_ ? size_ -> size : (stride_ ? stride_ -> size : 0 )),
319+ (size_ ? size_ -> data : NULL ),
320+ (stride_ ? stride_ -> data : NULL ));
311321}
312322
313323void THCTensor_ (setStorage1d )(THCState * state , THCTensor * self , THCStorage * storage_ , ptrdiff_t storageOffset_ ,
@@ -353,7 +363,7 @@ void THCTensor_(setStorage4d)(THCState *state, THCTensor *self, THCStorage *stor
353363 long size [4 ] = {size0_ , size1_ , size2_ , size3_ };
354364 long stride [4 ] = {stride0_ , stride1_ , stride2_ , stride3_ };
355365
356- THCTensor_ (rawSet )(state , self , storage_ , storageOffset_ , 4 , size , stride );
366+ THCTensor_ (setStorageNd )(state , self , storage_ , storageOffset_ , 4 , size , stride );
357367}
358368
359369
@@ -517,6 +527,33 @@ void THCTensor_(squeeze1d)(THCState *state, THCTensor *self, THCTensor *src, int
517527 }
518528}
519529
530+ void THCTensor_ (unsqueeze1d )(THCState * state , THCTensor * self , THCTensor * src , int dimension )
531+ {
532+ int d ;
533+
534+ if (!src )
535+ src = self ;
536+
537+ THArgCheck ((dimension >= 0 ) && (dimension <= src -> nDimension ), 3 , "dimension out of range" );
538+ THArgCheck (src -> nDimension > 0 , 3 , "cannot unsqueeze empty tensor" );
539+
540+ THCTensor_ (set )(state , self , src );
541+
542+ self -> size = (long * )THRealloc (self -> size , sizeof (long )* (self -> nDimension + 1 ));
543+ self -> stride = (long * )THRealloc (self -> stride , sizeof (long )* (self -> nDimension + 1 ));
544+ self -> nDimension ++ ;
545+ for (d = self -> nDimension - 1 ; d > dimension ; d -- ) {
546+ self -> size [d ] = self -> size [d - 1 ];
547+ self -> stride [d ] = self -> stride [d - 1 ];
548+ }
549+ if (dimension + 1 < self -> nDimension ) {
550+ self -> stride [dimension ] = self -> size [dimension + 1 ] * self -> stride [dimension + 1 ];
551+ } else {
552+ self -> stride [dimension ] = 1 ;
553+ }
554+ self -> size [dimension ] = 1 ;
555+ }
556+
520557int THCTensor_ (isContiguous )(THCState * state , const THCTensor * self )
521558{
522559 long z = 1 ;
@@ -637,7 +674,7 @@ static void THCTensor_(rawInit)(THCState *state, THCTensor *self)
637674 self -> flag = TH_TENSOR_REFCOUNTED ;
638675}
639676
640- static void THCTensor_ (rawSet )(THCState * state , THCTensor * self , THCStorage * storage , ptrdiff_t storageOffset , int nDimension , long * size , long * stride )
677+ void THCTensor_ (setStorageNd )(THCState * state , THCTensor * self , THCStorage * storage , ptrdiff_t storageOffset , int nDimension , long * size , long * stride )
641678{
642679 /* storage */
643680 if (self -> storage != storage )
@@ -660,10 +697,10 @@ static void THCTensor_(rawSet)(THCState *state, THCTensor *self, THCStorage *sto
660697 self -> storageOffset = storageOffset ;
661698
662699 /* size and stride */
663- THCTensor_ (rawResize )(state , self , nDimension , size , stride );
700+ THCTensor_ (resizeNd )(state , self , nDimension , size , stride );
664701}
665702
666- void THCTensor_ (rawResize )(THCState * state , THCTensor * self , int nDimension , long * size , long * stride )
703+ void THCTensor_ (resizeNd )(THCState * state , THCTensor * self , int nDimension , long * size , long * stride )
667704{
668705 int d ;
669706 int nDimension_ ;
0 commit comments