Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package octave-forge-splines for 
openSUSE:Factory checked in at 2023-10-31 20:25:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/octave-forge-splines (Old)
 and      /work/SRC/openSUSE:Factory/.octave-forge-splines.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "octave-forge-splines"

Tue Oct 31 20:25:38 2023 rev:7 rq:1121346 version:1.3.5

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/octave-forge-splines/octave-forge-splines.changes    
    2021-03-17 20:20:06.463330051 +0100
+++ 
/work/SRC/openSUSE:Factory/.octave-forge-splines.new.17445/octave-forge-splines.changes
     2023-10-31 20:25:52.962343217 +0100
@@ -1,0 +2,12 @@
+Mon Oct 30 16:01:00 UTC 2023 - Atri Bhattacharya <[email protected]>
+
+- Update URL to point to 'https://gnu-octave.github.io/packages/'
+
+-------------------------------------------------------------------
+Thu Oct 19 06:39:40 UTC 2023 - Atri Bhattacharya <[email protected]>
+
+- Update to version 1.3.5:
+  * bug fix in csape
+  * syntax made compatible with Octave 8
+
+-------------------------------------------------------------------

Old:
----
  splines-1.3.4.tar.gz

New:
----
  splines-1.3.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ octave-forge-splines.spec ++++++
--- /var/tmp/diff_new_pack.kuAtdJ/_old  2023-10-31 20:25:53.702370399 +0100
+++ /var/tmp/diff_new_pack.kuAtdJ/_new  2023-10-31 20:25:53.706370546 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package octave-forge-splines
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,12 +18,12 @@
 
 %define octpkg  splines
 Name:           octave-forge-%{octpkg}
-Version:        1.3.4
+Version:        1.3.5
 Release:        0
 Summary:        Additional spline functions for Octave
 License:        GPL-2.0-or-later AND GPL-3.0-or-later AND SUSE-Public-Domain
 Group:          Productivity/Scientific/Math
-URL:            https://octave.sourceforge.io
+URL:            https://gnu-octave.github.io/packages/%{octpkg}/
 Source0:        
https://downloads.sourceforge.net/octave/%{octpkg}-%{version}.tar.gz
 BuildArch:      noarch
 BuildRequires:  octave-devel

++++++ splines-1.3.4.tar.gz -> splines-1.3.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/splines-1.3.4/DESCRIPTION new/splines/DESCRIPTION
--- old/splines-1.3.4/DESCRIPTION       2021-02-24 02:14:16.000000000 +0100
+++ new/splines/DESCRIPTION     2023-05-05 17:23:35.000000000 +0200
@@ -1,8 +1,8 @@
 Name: splines
-Version: 1.3.4
-Date: 2021-02-23
+Version: 1.3.5
+Date: 2023-05-05
 Author: various authors
-Maintainer: Nir Krakauer <[email protected]>
+Maintainer: Nir Krakauer <[email protected]>
 Title: Splines.
 Description: Additional spline functions.
 Categories: Splines
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/splines-1.3.4/Makefile new/splines/Makefile
--- old/splines-1.3.4/Makefile  2021-02-24 02:14:16.000000000 +0100
+++ new/splines/Makefile        1970-01-01 01:00:00.000000000 +0100
@@ -1,235 +0,0 @@
-## Copyright 2015-2016 Carnë Draug
-## Copyright 2015-2016 Oliver Heimlich
-## Copyright 2017 Julien Bect <[email protected]>
-## Copyright 2017 Olaf Till <[email protected]>
-##
-## Copying and distribution of this file, with or without modification,
-## are permitted in any medium without royalty provided the copyright
-## notice and this notice are preserved.  This file is offered as-is,
-## without any warranty.
-
-## Some basic tools (can be overriden using environment variables)
-SED ?= sed
-TAR ?= tar
-GREP ?= grep
-CUT ?= cut
-TR ?= tr
-
-## Note the use of ':=' (immediate set) and not just '=' (lazy set).
-## http://stackoverflow.com/a/448939/1609556
-package := $(shell $(GREP) "^Name: " DESCRIPTION | $(CUT) -f2 -d" " | \
-$(TR) '[:upper:]' '[:lower:]')
-version := $(shell $(GREP) "^Version: " DESCRIPTION | $(CUT) -f2 -d" ")
-
-## These are the paths that will be created for the releases.
-target_dir       := target
-release_dir      := $(target_dir)/$(package)-$(version)
-release_tarball  := $(target_dir)/$(package)-$(version).tar.gz
-html_dir         := $(target_dir)/$(package)-html
-html_tarball     := $(target_dir)/$(package)-html.tar.gz
-## Using $(realpath ...) avoids problems with symlinks due to bug
-## #50994 in Octaves scripts/pkg/private/install.m.  But at least the
-## release directory above is needed in the relative form, for 'git
-## archive --format=tar --prefix=$(release_dir).
-real_target_dir  := $(realpath .)/$(target_dir)
-installation_dir := $(real_target_dir)/.installation
-package_list     := $(installation_dir)/.octave_packages
-install_stamp    := $(installation_dir)/.install_stamp
-
-## These can be set by environment variables which allow to easily
-## test with different Octave versions.
-ifndef OCTAVE
-OCTAVE := octave
-endif
-OCTAVE := $(OCTAVE) --no-gui --silent --norc
-MKOCTFILE ?= mkoctfile
-
-## Command used to set permissions before creating tarballs
-FIX_PERMISSIONS ?= chmod -R a+rX,u+w,go-w,ug-s
-
-## Detect which VCS is used
-vcs := $(if $(wildcard .hg),hg,$(if $(wildcard .git),git,unknown))
-ifeq ($(vcs),hg)
-release_dir_dep := .hg/dirstate
-endif
-ifeq ($(vcs),git)
-release_dir_dep := .git/index
-endif
-
-
-## .PHONY indicates targets that are not filenames
-## (https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html)
-.PHONY: help
-
-## make will display the command before runnning them.  Use @command
-## to not display it (makes specially sense for echo).
-help:
-       @echo "Targets:"
-       @echo "   dist    - Create $(release_tarball) for release."
-       @echo "   html    - Create $(html_tarball) for release."
-       @echo "   release - Create both of the above and show md5sums."
-       @echo "   install - Install the package in $(installation_dir), where 
it is not visible in a normal Octave session."
-       @echo "   check   - Execute package tests."
-       @echo "   doctest - Test the help texts with the doctest package."
-       @echo "   run     - Run Octave with the package installed in 
$(installation_dir) in the path."
-       @echo "   clean   - Remove everything made with this Makefile."
-
-
-##
-## Recipes for release tarballs (package + html)
-##
-
-.PHONY: release dist html clean-tarballs clean-unpacked-release
-
-## To make a release, build the distribution and html tarballs.
-release: dist html
-       md5sum $(release_tarball) $(html_tarball)
-       @echo "Upload @ https://sourceforge.net/p/octave/package-releases/new/";
-       @echo "    and note the changeset the release corresponds to"
-
-## dist and html targets are only PHONY/alias targets to the release
-## and html tarballs.
-dist: $(release_tarball)
-html: $(html_tarball)
-
-## An implicit rule with a recipe to build the tarballs correctly.
-%.tar.gz: %
-       $(TAR) -c -f - --posix -C "$(target_dir)/" "$(notdir $<)" | gzip -9n > 
"$@"
-
-clean-tarballs:
-       @echo "## Cleaning release tarballs (package + html)..."
-       -$(RM) $(release_tarball) $(html_tarball)
-       @echo
-
-## Create the unpacked package.
-##
-## Notes:
-##    * having ".hg/dirstate" (or ".git/index") as a prerequesite means it is
-##      only rebuilt if we are at a different commit.
-##    * the variable RM usually defaults to "rm -f"
-##    * having this recipe separate from the one that makes the tarball
-##      makes it easy to have packages in alternative formats (such as zip)
-##    * note that if a commands needs to be run in a specific directory,
-##      the command to "cd" needs to be on the same line.  Each line restores
-##      the original working directory.
-$(release_dir): $(release_dir_dep)
-       -$(RM) -r "$@"
-ifeq (${vcs},hg)
-       hg archive --exclude ".hg*" --type files "$@"
-endif
-ifeq (${vcs},git)
-       git archive --format=tar --prefix="$@/" HEAD | $(TAR) -x
-       $(RM) "$@/.gitignore"
-endif
-## Don't fall back to run the supposed necessary contents of
-## 'bootstrap' here. Users are better off if they provide
-## 'bootstrap'. Administrators, checking build reproducibility, can
-## put in the missing 'bootstrap' file if they feel they know its
-## necessary contents.
-ifneq (,$(wildcard src/bootstrap))
-       cd "$@/src" && ./bootstrap && $(RM) -r "autom4te.cache"
-endif
-## Uncomment this if your src/Makefile.in has these targets for
-## pre-building something for the release (e.g. documentation).
-#      cd "$@/src" && ./configure && $(MAKE) prebuild && \
-#        $(MAKE) distclean && $(RM) Makefile
-##
-       ${FIX_PERMISSIONS} "$@"
-
-run_in_place = $(OCTAVE) --eval ' pkg ("local_list", "$(package_list)"); ' \
-                         --eval ' pkg ("load", "$(package)"); '
-
-html_options = --eval 'options = get_html_options ("octave-forge");'
-## Uncomment this for package documentation.
-# html_options = --eval 'options = get_html_options ("octave-forge");' \
-#                --eval 'options.package_doc = "$(package).texi";'
-$(html_dir): $(install_stamp)
-       $(RM) -r "$@";
-       $(run_in_place)                    \
-        --eval ' pkg load generate_html; ' \
-       $(html_options)                    \
-        --eval ' generate_package_html ("$(package)", "$@", options); ';
-       $(FIX_PERMISSIONS) "$@";
-
-clean-unpacked-release:
-       @echo "## Cleaning unpacked release tarballs (package + html)..."
-       -$(RM) -r $(release_dir) $(html_dir)
-       @echo
-
-##
-## Recipes for installing the package.
-##
-
-.PHONY: install clean-install
-
-octave_install_commands = \
-' llist_path = pkg ("local_list"); \
-  mkdir ("$(installation_dir)"); \
-  load (llist_path); \
-  local_packages(cellfun (@ (x) strcmp ("$(package)", x.name), 
local_packages)) = []; \
-  save ("$(package_list)", "local_packages"); \
-  pkg ("local_list", "$(package_list)"); \
-  pkg ("prefix", "$(installation_dir)", "$(installation_dir)"); \
-  pkg ("install", "-local", "-verbose", "$(release_tarball)"); '
-
-## Install unconditionally. Maybe useful for testing installation with
-## different versions of Octave.
-install: $(release_tarball)
-       @echo "Installing package under $(installation_dir) ..."
-       $(OCTAVE) --eval $(octave_install_commands)
-       touch $(install_stamp)
-
-## Install only if installation (under target/...) is not current.
-$(install_stamp): $(release_tarball)
-       @echo "Installing package under $(installation_dir) ..."
-       $(OCTAVE) --eval $(octave_install_commands)
-       touch $(install_stamp)
-
-clean-install:
-       @echo "## Cleaning installation under $(installation_dir) ..."
-       -$(RM) -r $(installation_dir)
-       @echo
-
-
-##
-## Recipes for testing purposes
-##
-
-.PHONY: run doctest check
-
-## Start an Octave session with the package directories on the path for
-## interactice test of development sources.
-run: $(install_stamp)
-       $(run_in_place) --persist
-
-## Test example blocks in the documentation.  Needs doctest package
-##  https://octave.sourceforge.io/doctest/index.html
-doctest: $(install_stamp)
-       $(run_in_place) --eval 'pkg load doctest;'                              
                            \
-         --eval "targets = '$(shell (ls inst; ls src | $(GREP) .oct) | $(CUT) 
-f2 -d@ | $(CUT) -f1 -d.)';" \
-         --eval "targets = strsplit (targets, ' ');  doctest (targets);"
-
-
-## Test package.
-octave_test_commands = \
-' args = {"inst", "src"}; \
-  args(cellfun (@ (x) isempty (a = stat (x)) || ! S_ISDIR (a.mode), args)) = 
[]; \
-  if (isempty (args)) error ("no \"inst\" or \"src\" directory"); exit (1); \
-    else cellfun(@runtests, args); endif '
-check: $(install_stamp)
-       $(run_in_place) --eval $(octave_test_commands)
-
-
-##
-## CLEAN
-##
-
-.PHONY: clean
-
-clean: clean-tarballs clean-unpacked-release clean-install
-       @echo "## Removing target directory (if empty)..."
-       -rmdir $(target_dir)
-       @echo
-       @echo "## Cleaning done"
-       @echo
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/splines-1.3.4/NEWS new/splines/NEWS
--- old/splines-1.3.4/NEWS      2021-02-24 02:14:16.000000000 +0100
+++ new/splines/NEWS    2023-05-05 17:23:35.000000000 +0200
@@ -1,3 +1,10 @@
+
+Summary of important user-visible changes for splines 1.3.5:
+-------------------------------------------------------------------
+
+ ** bug fix in csape
+ ** syntax made compatible with Octave 8
+
 Summary of important user-visible changes for splines 1.3.4:
 -------------------------------------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/splines-1.3.4/inst/csape.m new/splines/inst/csape.m
--- old/splines-1.3.4/inst/csape.m      2021-02-24 02:14:16.000000000 +0100
+++ new/splines/inst/csape.m    2023-05-05 17:23:35.000000000 +0200
@@ -101,7 +101,7 @@
       g = [3*(d(1, :) - valc(1, :)); g; 3*(valc(2, :) - d(end, :))];
       c = A \ g;
     else
-      dg = 2 * (h(1:n - 2) .+ h(2:n - 1));
+      dg = 2 * (h(1:n - 2) + h(2:n - 1));
       dg(1) = dg(1) - 0.5 * h(1);
       dg(n - 2) = dg(n-2) - 0.5 * h(n - 1);
 
@@ -139,49 +139,37 @@
     g(1,:) = g(1,:) - h(1) * c(1,:);
     g(n - 2,:) = g(n-2,:) - h(n - 1) * c(n,:);
 
-    if( n == 3)
-      dg = 2 * h(1);
-      c(2:n - 1,:) = g / dg;
-    else
-      dg = 2 * (h(1:n - 2) .+ h(2:n - 1));
-      e = h(2:n - 2);
-      c(2:n - 1,:) = spdiags([[e(:);0],dg,[0;e(:)]],[-1,0,1],n-2,n-2) \ g;
-    end
+    dg = 2 * (h(1:n - 2) + h(2:n - 1));
+    e = h(2:n - 2);
+    c(2:n - 1,:) = spdiags([[e(:);0],dg,[0;e(:)]],[-1,0,1],n-2,n-2) \ g;
         
     b(1:n - 1,:) = diff (a) ./ h(1:n - 1,idx)...
       - h(1:n - 1,idx) / 3 .* (c(2:n,:) + 2 * c(1:n - 1,:));
     d = diff (c) ./ (3 * h(1:n - 1, idx));
   
   elseif (strcmp(cond,"periodic"))
-
-    h = [h; h(1)];
-
-    ## XXX FIXME XXX --- the following gives a smoother periodic transition:
-    ##    a(n,:) = a(1,:) = ( a(n,:) + a(1,:) ) / 2;
-    a(n,:) = a(1,:);
-
-    tmp = diff (shift ([a; a(2,:)], -1));
-    g = 3 * tmp(1:n - 1,:) ./ h(2:n,idx)...
-      - 3 * diff (a) ./ h(1:n - 1,idx);
-
-    if (n > 3)
-      dg = 2 * (h(1:n - 1) .+ h(2:n));
-      e = h(2:n - 1);
-
-      ## Use Sherman-Morrison formula to extend the solution
-      ## to the cyclic system. See Numerical Recipes in C, pp 73-75
-      gamma = - dg(1);
-      dg(1) -=  gamma;
-      dg(end) -= h(1) * h(1) / gamma; 
-      z = spdiags([[e(:);0],dg,[0;e(:)]],[-1,0,1],n-1,n-1) \ ...
-          [[gamma; zeros(n-3,1); h(1)],g];
-      fact = (z(1,2:end) + h(1) * z(end,2:end) / gamma) / ...
-          (1.0 + z(1,1) + h(1) * z(end,1) / gamma);
-
-      c(2:n,:) = z(:,2:end) - z(:,1) * fact;
-    endif
-
-    c(1,:) = c(n,:);
+  
+    D = diff(a) ./ h;
+    A = sparse (n-1);
+    v = zeros (n-1, m);
+    for i = 2:(n-2)
+      A(i, i-1) = h(i-1);
+      A(i, i) = 2 * (h(i-1) + h(i));
+      A(i, i+1) = h(i);
+      v(i, :) = 3 * (D(i, :) - D(i-1, :));
+    endfor
+    A(1, 1) = 2 * (h(1) + h(n-1));
+    A(1, 2) = h(1);
+    A(1, n-1) += h(n-1);
+    v(1, :) = 3 * (D(1, :) - D(n-1, :));
+    A(n-1, 1) = h(n-1);
+    A(n-1, n-2) += h(n-2);
+    A(n-1, n-1) = 2 * (h(n-2) + h(n-1));
+    v(n-1, :) = 3 * (D(n-1, :) - D(n-2, :));
+    c = A \ v; #this is a cyclic tridiagonal system -- the Sherwood-Morrison 
formula
+               #could be used to solve it if \ is too slow in this case
+    
+    c(n,:) = c(1,:);
     b = diff (a) ./ h(1:n - 1,idx)...
       - h(1:n - 1,idx) / 3 .* (c(2:n,:) + 2 * c(1:n - 1,:));
     b(n,:) = b(1,:);
@@ -202,7 +190,7 @@
       g(2:n - 3,:) = 3 * diff (a(3:n - 1,:)) ./ h(3:n - 2,idx)...
         - 3 * diff (a(2:n - 2,:)) ./ h(2:n - 3,idx);
 
-      dg = 2 * (h(1:n - 2) .+ h(2:n - 1));
+      dg = 2 * (h(1:n - 2) + h(2:n - 1));
       dg(1) = dg(1) - h(1);
       dg(n - 2) = dg(n-2) - h(n - 1);
 
@@ -219,18 +207,21 @@
       c(2:n - 1,:) = spdiags([[ldg(:);0],dg,[0;udg(:)]],[-1,0,1],n-2,n-2) \ g;
       
     else # n == 3
-            
-      dg= [h(1) + 2 * h(2)];
-      c(2:n - 1,:) = g/dg(1);
-
+    #with only 3 points, the not-a-knot cubic spline is not unique;
+    #we choose the one where the cubic coefficients are zero,
+    #which is the interpolating quadratic polynomial
+      c = repmat ((a(1,:) - a(3,:)) / ((x(3) - x(1)) * (x(2) - x(3))) ...
+          + (a(2,:) - a(1,:)) / ((x(2) - x(1)) * (x(2) - x(3))), [3 1]);
+    endif
+    if n == 3
+      d = zeros (n, m);
+    else
+      c(1,:) = c(2,:) + h(1) / h(2) * (c(2,:) - c(3,:));
+      c(n,:) = c(n - 1,:) + h(n - 1) / h(n - 2) * (c(n - 1,:) - c(n - 2,:));
+      d = diff (c) ./ (3 * h(1:n - 1, idx));
     endif
-
-    c(1,:) = c(2,:) + h(1) / h(2) * (c(2,:) - c(3,:));
-    c(n,:) = c(n - 1,:) + h(n - 1) / h(n - 2) * (c(n - 1,:) - c(n - 2,:));
     b = diff (a) ./ h(1:n - 1, idx)...
       - h(1:n - 1, idx) / 3 .* (c(2:n,:) + 2 * c(1:n - 1,:));
-    d = diff (c) ./ (3 * h(1:n - 1, idx));
-
   else
     msg = sprintf("unknown end condition: %s",cond);
     error (msg);
@@ -242,7 +233,7 @@
 endfunction
 
 
-%!shared x,x2,y,cond,pp,pp1,pp2,h,valc
+%!shared x,x2,y,cond,pp,pp1,pp2,h,valc,xi,yi
 %! x = linspace(0,2*pi,5); y = sin(x); x2 = linspace(0,2*pi,16);
 
 %!assert (ppval(csape(x,y),x), y, 10*eps);
@@ -253,6 +244,7 @@
 %!        [ppval(csape(x,y),x);ppval(csape(x,y),x)], 10*eps)
 %!assert (ppval(csape(x,[y;y]),x2),  ...
 %!        [ppval(csape(x,y),x2);ppval(csape(x,y),x2)], 10*eps)
+%!assert (ppval(csape([1 2 4],[2, 3, 6]), 3), 13/3, 10*eps);
 
 %!test cond='complete';
 %!assert (ppval(csape(x,y,cond),x), y, 10*eps);
@@ -263,6 +255,7 @@
 %!        [ppval(csape(x,y,cond),x);ppval(csape(x,y,cond),x)], 10*eps)
 %!assert (ppval(csape(x,[y;y],cond),x2),  ...
 %!        [ppval(csape(x,y,cond),x2);ppval(csape(x,y,cond),x2)], 10*eps)
+%!assert (ppval(csape([1 2 4],[2, 3, 6], cond, [2 1]), 3), 215/48, 10*eps);
 
 %!test cond='variational';
 %!assert (ppval(csape(x,y,cond),x), y, 10*eps);
@@ -273,6 +266,8 @@
 %!        [ppval(csape(x,y,cond),x);ppval(csape(x,y,cond),x)], 10*eps)
 %!assert (ppval(csape(x,[y;y],cond),x2),  ...
 %!        [ppval(csape(x,y,cond),x2);ppval(csape(x,y,cond),x2)], 10*eps)
+%!assert (ppval(csape([1 2 3],[2, 3, 5],cond), 1.5), 2.40625, 10*eps);
+%!assert (ppval(csape([1 2 4],[2, 3, 6], cond), 3), 4.375, 10*eps);
 
 %!test cond='second';
 %!assert (ppval(csape(x,y,cond),x), y, 10*eps);
@@ -283,6 +278,7 @@
 %!        [ppval(csape(x,y,cond),x);ppval(csape(x,y,cond),x)], 10*eps)
 %!assert (ppval(csape(x,[y;y],cond),x2),  ...
 %!        [ppval(csape(x,y,cond),x2);ppval(csape(x,y,cond),x2)], 10*eps)
+%!assert (ppval(csape([1 2 4],[2, 3, 6], cond, [1 2]), 3), 49/12, 10*eps);
 
 %!test cond='periodic';
 %!assert (ppval(csape(x,y,cond),x), y, 10*eps);
@@ -305,6 +301,9 @@
 %!        [ppval(csape(x,y,cond),x2);ppval(csape(x,y,cond),x2)], 10*eps)
 %!assert (ppval(csape(x(1:4),y(1:4),cond),x(1:4)), y(1:4), 10*eps);
 %!assert (ppval(csape(x(1:4)',y(1:4)',cond),x(1:4)), y(1:4), 10*eps);
+%!test assert (ppval(csape([1 2 4],[2, 3, 6], 'not-a-knot'), 3), 13/3, 10*eps);
+%!test assert (ppval(csape([1 2 4 5],[2, 3, 6, 5], 'not-a-knot'), 3), 29/6, 
10*eps);
+%!test assert (ppval(csape([1 2 4 5 6],[2, 3, 6, 5, 6], 'not-a-knot'), 3), 
141/28, 10*eps);
 
 %!test cond='complete';
 %! h = pi/6; n = 3; x = linspace(0,(n-1)*h,n)'; y = sin(x); valc = cos([x(1) 
x(end)]); pp = csape(x, y, cond, valc);
@@ -328,3 +327,26 @@
 %! y = [sin(x) cos(x)]; valc = [cos([x(1); x(end)]) -sin([x(1); x(end)])]; pp2 
= csape(x, y, cond, valc);
 %!assert (pp2.coefs([1 3], :), pp.coefs)
 %!assert (pp2.coefs([2 4], :), pp1.coefs)
+
+# more tests of correctness for periodic boundary conditions
+%!test cond='periodic';
+%! x = [1 2 4 5 6]'; y = [2 3 6 5 6]'; xi = 3; yi = 129/26; pp = csape (x, y, 
cond);
+%!assert (ppval(pp, x), y, 10*eps);
+%!assert (ppval(pp, xi), yi, 10*eps);
+%!assert (ppval(ppder(pp), x(1)), ppval(ppder(pp), x(end)), 10*eps);
+%!assert (ppval(ppder(pp, 2), x(1)), ppval(ppder(pp, 2), x(end)), 10*eps);
+%! x = [1 2 4 6]'; y = [2 3 4 2]'; xi = 3; yi = 4 + 1/64; pp = csape (x, y, 
cond);
+%!assert (ppval(pp, x), y, 10*eps);
+%!assert (ppval(pp, xi), yi, 10*eps);
+%!assert (ppval(ppder(pp), x(1)), ppval(ppder(pp), x(end)), 10*eps);
+%!assert (ppval(ppder(pp, 2), x(1)), ppval(ppder(pp, 2), x(end)), 10*eps);
+%! x = [1 2 4 5]'; y = [2 3 6 5]'; xi = 3; yi = 5.1; pp = csape (x, y, cond);
+%!assert (ppval(pp, x), y, 10*eps);
+%!assert (ppval(pp, xi), yi, 10*eps);
+%!assert (ppval(ppder(pp), x(1)), ppval(ppder(pp), x(end)), 10*eps);
+%!assert (ppval(ppder(pp, 2), x(1)), ppval(ppder(pp, 2), x(end)), 10*eps);
+%! x = [1 2 4]'; y = [2 3 2]'; xi = 3; yi = 2.5; pp = csape (x, y, cond);
+%!assert (ppval(pp, x), y, 10*eps);
+%!assert (ppval(pp, xi), yi, 10*eps);
+%!assert (ppval(ppder(pp), x(1)), ppval(ppder(pp), x(end)), 10*eps);
+%!assert (ppval(ppder(pp, 2), x(1)), ppval(ppder(pp, 2), x(end)), 10*eps);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/splines-1.3.4/inst/csaps.m new/splines/inst/csaps.m
--- old/splines-1.3.4/inst/csaps.m      2021-02-24 02:14:16.000000000 +0100
+++ new/splines/inst/csaps.m    2023-05-05 17:23:35.000000000 +0200
@@ -1,4 +1,4 @@
-## Copyright (C) 2012-2015 Nir Krakauer
+## Copyright (C) 2012-2021 Nir Krakauer
 ##
 ## This program is free software; you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published by
@@ -14,8 +14,8 @@
 ## along with this program; If not, see <http://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn{Function File}{[@var{yi} @var{p} @var{sigma2} @var{unc_yi} 
@var{df}] =} csaps(@var{x}, @var{y}, @var{p}, @var{xi}, @var{w}=[])
-## @deftypefnx{Function File}{[@var{pp} @var{p} @var{sigma2}] =} 
csaps(@var{x}, @var{y}, @var{p}, [], @var{w}=[])
+## @deftypefn{Function File}{[@var{yi} @var{p} @var{sigma2} @var{unc_yi} 
@var{df}] =} csaps(@var{x}, @var{y}, @var{p}=[], @var{xi}=[], @var{w}=[])
+## @deftypefnx{Function File}{[@var{pp} @var{p} @var{sigma2}] =} 
csaps(@var{x}, @var{y}, @var{p}=[], [], @var{w}=[])
 ##
 ## Cubic spline approximation (smoothing)@*
 ## approximate [@var{x},@var{y}], weighted by @var{w} (inverse variance of the 
@var{y} values; if not given, equal weighting is assumed), at @var{xi}
@@ -26,12 +26,13 @@
 ##
 ## @var{x} and @var{w} should be n by 1 in size; @var{y} should be n by m; 
@var{xi} should be k by 1; the values in @var{x} should be distinct and in 
ascending order; the values in @var{w} should be nonzero
 ##
+## @var{p} should be a scalar or empty:@*
 ## @table @asis
 ## @item @var{p}=0
 ##       maximum smoothing: straight line
 ## @item @var{p}=1
 ##       no smoothing: interpolation
-## @item @var{p}<0 or not given
+## @item @var{p}<0 or empty
 ##       an intermediate amount of smoothing is chosen @*
 ##       and the corresponding @var{p} between 0 and 1 is returned @*
 ##       (such that the smoothing term and the interpolation term are of the 
same magnitude) @*
@@ -55,18 +56,10 @@
 
 ## Author: Nir Krakauer <[email protected]>
 
-function [ret,p,sigma2,unc_yi,df]=csaps(x,y,p,xi,w)
+function [ret,p,sigma2,unc_yi,df]=csaps(x,y,p=[],xi=[],w=[])
 
-warning ("off", "Octave:broadcast", "local");
-
-  if(nargin < 5)
-    w = [];
-    if(nargin < 4)
-      xi = [];
-      if(nargin < 3)
-             p = [];
-      endif
-    endif
+  if !(isscalar(p) || isempty(p))
+    error('p should be a scalar or empty')
   endif
 
   if(columns(x) > 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/splines-1.3.4/inst/csaps_sel.m 
new/splines/inst/csaps_sel.m
--- old/splines-1.3.4/inst/csaps_sel.m  2021-02-24 02:14:16.000000000 +0100
+++ new/splines/inst/csaps_sel.m        2023-05-05 17:23:35.000000000 +0200
@@ -46,6 +46,8 @@
 ##
 ## Grace Wahba (1983), Bayesian ``confidence intervals'' for the 
cross-validated smoothing spline, J Royal Statistical Society, 45B:133-150
 ##
+## Herman J. Woltring (1986), A Fortran package for generalized, 
cross-validatory spline smoothing and differentiation, Advances in Engineering 
Software, 8(2):104–113
+##
 ## @end deftypefn
 ## @seealso{csaps, spline, csapi, ppval, dedup, bin_values, gcvspl}
 

Reply via email to