docs: public static void horizontalInverse(BorderIndex1D border , WlBorderCoef<WlCoef_F32> inverseCoef , GrayF32 input , GrayF32 output ) {
  
  		UtilWavelet.checkShape(output,input);
  
  		float []trends = new float[ output.width ];
  		float []details = new float[ output.width ];
  
  		boolean isLarger = input.width >= output.width;
  		int paddedWidth = output.width + output.width%2;
  
  		final int lowerBorder = inverseCoef.getLowerLength()*2;
  		final int upperBorder = output.width - inverseCoef.getUpperLength()*2;
  
  		border.setLength(output.width+output.width%2);
  
  		WlCoef_F32 coefficients;
  
  		for( int y = 0; y < output.height; y++ ) {
  
  			for( int i = 0; i < details.length; i++ ) {
  				details[i] = 0;
  				trends[i] = 0;
  			}
  
  			for( int x = 0; x < output.width; x += 2 ) {
  				float a = input.get(x/2,y);
  				float d = input.get(input.width/2+x/2,y);
  
  				if( x < lowerBorder ) {
  					coefficients = inverseCoef.getBorderCoefficients(x);
  				} else if( x >= upperBorder ) {
  					coefficients = inverseCoef.getBorderCoefficients(x-paddedWidth);
  				} else {
  					coefficients = inverseCoef.getInnerCoefficients();
  				}
  
  				final int offsetA = coefficients.offsetScaling;
  				final int offsetB = coefficients.offsetWavelet;
  				final float[] alpha = coefficients.scaling;
  				final float[] beta = coefficients.wavelet;
  
  				// add the trend
  				for( int i = 0; i < alpha.length; i++ ) {
  					// if an odd image don't update the outer edge
  					int xx = border.getIndex(x+offsetA+i);
  					if( isLarger && xx >= output.width )
  						continue;
  					trends[xx] += a*alpha[i];
  				}
  
  				// add the detail signal
  				for( int i = 0; i < beta.length; i++ ) {
  					int xx = border.getIndex(x+offsetB+i);
  					if( isLarger && xx >= output.width )
  						continue;
  					details[xx] += d*beta[i];
  				}
  			}
  
  			for( int x = 0; x < output.width; x++ ) {
  				output.set(x,y, trends[x] + details[x]);
  			}
  		}
  	}