stop using submodule
This commit is contained in:
parent
25c3010de6
commit
1a5ba98950
58
packages/real/CMakeLists.txt
Normal file
58
packages/real/CMakeLists.txt
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
|
||||||
|
PROJECT ( YAP_REAL C )
|
||||||
|
|
||||||
|
macro_optional_find_package (R ON)
|
||||||
|
|
||||||
|
macro_log_feature (R_HOME "R"
|
||||||
|
"Use R Environment"
|
||||||
|
"http://www.r.org" FALSE)
|
||||||
|
|
||||||
|
if (R_HOME)
|
||||||
|
|
||||||
|
set (REAL_SOURCES
|
||||||
|
real.c
|
||||||
|
real.pl
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories (
|
||||||
|
${R_INCLUDE_DIR}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
set (CMAKE_REQUIRED_INCLUDES
|
||||||
|
${R_INCLUDE_DIR}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#R_COMMAND - Path to R command
|
||||||
|
# R_HOME - Path to 'R home', as reported by R
|
||||||
|
# R_INCLUDE_DIR - Path to R include directory
|
||||||
|
# R_LIBRARY_BASE - Path to R library
|
||||||
|
# R_LIBRARY_BLAS - Path to Rblas / blas library
|
||||||
|
# R_LIBRARY_LAPACK - Path to Rlapack / lapack library
|
||||||
|
# R_LIBRARY_READLINE - Path to readline library
|
||||||
|
# R_LIBRARIES - Array of: R_LIBRARY_BASE, R_LIBRARY_BLAS, R_LIBRARY_LAPACK, R_LIBRARY_BASE [, R_LIBRARY_READLINE]
|
||||||
|
|
||||||
|
add_library (real SHARED ${REAL_SOURCES})
|
||||||
|
|
||||||
|
target_link_libraries (real ${R_LIBRARIES} libYap )
|
||||||
|
|
||||||
|
set_target_properties (real PROPERTIES PREFIX "")
|
||||||
|
|
||||||
|
check_include_files( R.h HAVE_R_H )
|
||||||
|
check_include_files ( "R.h;Rembedded.h" HAVE_R_EMBEDDED_H )
|
||||||
|
check_include_files( "Rembedded.h;Rinterface.h" HAVE_R_INTERFACE_H )
|
||||||
|
|
||||||
|
configure_file ("rconfig.h.cmake" "rconfig.h" )
|
||||||
|
|
||||||
|
install(TARGETS real
|
||||||
|
LIBRARY DESTINATION ${dlls}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(FILES real.pl
|
||||||
|
DESTINATION ${libpl}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
endif (R_HOME)
|
182
packages/real/LICENSE
Normal file
182
packages/real/LICENSE
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
Artistic License 2.0
|
||||||
|
|
||||||
|
Copyright (c) 2000-2006, The Perl Foundation.
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed. Preamble
|
||||||
|
|
||||||
|
This license establishes the terms under which a given free software
|
||||||
|
Package may be copied, modified, distributed, and/or
|
||||||
|
redistributed. The intent is that the Copyright Holder maintains some
|
||||||
|
artistic control over the development of that Package while still
|
||||||
|
keeping the Package available as open source and free software.
|
||||||
|
|
||||||
|
You are always permitted to make arrangements wholly outside of this
|
||||||
|
license directly with the Copyright Holder of a given Package. If the
|
||||||
|
terms of this license do not permit the full use that you propose to
|
||||||
|
make of the Package, you should contact the Copyright Holder and seek
|
||||||
|
a different licensing arrangement. Definitions
|
||||||
|
|
||||||
|
"Copyright Holder" means the individual(s) or organization(s) named in
|
||||||
|
the copyright notice for the entire Package.
|
||||||
|
|
||||||
|
"Contributor" means any party that has contributed code or other
|
||||||
|
material to the Package, in accordance with the Copyright Holder's
|
||||||
|
procedures.
|
||||||
|
|
||||||
|
"You" and "your" means any person who would like to copy, distribute,
|
||||||
|
or modify the Package.
|
||||||
|
|
||||||
|
"Package" means the collection of files distributed by the Copyright
|
||||||
|
Holder, and derivatives of that collection and/or of those files. A
|
||||||
|
given Package may consist of either the Standard Version, or a
|
||||||
|
Modified Version.
|
||||||
|
|
||||||
|
"Distribute" means providing a copy of the Package or making it
|
||||||
|
accessible to anyone else, or in the case of a company or
|
||||||
|
organization, to others outside of your company or organization.
|
||||||
|
|
||||||
|
"Distributor Fee" means any fee that you charge for Distributing this
|
||||||
|
Package or providing support for this Package to another party. It
|
||||||
|
does not mean licensing fees.
|
||||||
|
|
||||||
|
"Standard Version" refers to the Package if it has not been modified,
|
||||||
|
or has been modified only in ways explicitly requested by the
|
||||||
|
Copyright Holder.
|
||||||
|
|
||||||
|
"Modified Version" means the Package, if it has been changed, and such
|
||||||
|
changes were not explicitly requested by the Copyright Holder.
|
||||||
|
|
||||||
|
"Original License" means this Artistic License as Distributed with the
|
||||||
|
Standard Version of the Package, in its current version or as it may
|
||||||
|
be modified by The Perl Foundation in the future.
|
||||||
|
|
||||||
|
"Source" form means the source code, documentation source, and
|
||||||
|
configuration files for the Package.
|
||||||
|
|
||||||
|
"Compiled" form means the compiled bytecode, object code, binary, or
|
||||||
|
any other form resulting from mechanical transformation or translation
|
||||||
|
of the Source form.
|
||||||
|
|
||||||
|
Permission for Use and Modification Without Distribution
|
||||||
|
|
||||||
|
(1) You are permitted to use the Standard Version and create and use
|
||||||
|
Modified Versions for any purpose without restriction, provided that
|
||||||
|
you do not Distribute the Modified Version.
|
||||||
|
|
||||||
|
Permissions for Redistribution of the Standard Version
|
||||||
|
|
||||||
|
(2) You may Distribute verbatim copies of the Source form of the
|
||||||
|
Standard Version of this Package in any medium without restriction,
|
||||||
|
either gratis or for a Distributor Fee, provided that you duplicate
|
||||||
|
all of the original copyright notices and associated disclaimers. At
|
||||||
|
your discretion, such verbatim copies may or may not include a
|
||||||
|
Compiled form of the Package.
|
||||||
|
|
||||||
|
(3) You may apply any bug fixes, portability changes, and other
|
||||||
|
modifications made available from the Copyright Holder. The resulting
|
||||||
|
Package will still be considered the Standard Version, and as such
|
||||||
|
will be subject to the Original License.
|
||||||
|
|
||||||
|
Distribution of Modified Versions of the Package as Source
|
||||||
|
|
||||||
|
(4) You may Distribute your Modified Version as Source (either gratis
|
||||||
|
or for a Distributor Fee, and with or without a Compiled form of the
|
||||||
|
Modified Version) provided that you clearly document how it differs
|
||||||
|
from the Standard Version, including, but not limited to, documenting
|
||||||
|
any non-standard features, executables, or modules, and provided that
|
||||||
|
you do at least ONE of the following:
|
||||||
|
|
||||||
|
(a) make the Modified Version available to the Copyright Holder of the
|
||||||
|
Standard Version, under the Original License, so that the Copyright
|
||||||
|
Holder may include your modifications in the Standard Version. (b)
|
||||||
|
ensure that installation of your Modified Version does not prevent the
|
||||||
|
user installing or running the Standard Version. In addition, the
|
||||||
|
modified Version must bear a name that is different from the name of
|
||||||
|
the Standard Version. (c) allow anyone who receives a copy of the
|
||||||
|
Modified Version to make the Source form of the Modified Version
|
||||||
|
available to others under (i) the Original License or (ii) a license
|
||||||
|
that permits the licensee to freely copy, modify and redistribute the
|
||||||
|
Modified Version using the same licensing terms that apply to the copy
|
||||||
|
that the licensee received, and requires that the Source form of the
|
||||||
|
Modified Version, and of any works derived from it, be made freely
|
||||||
|
available in that license fees are prohibited but Distributor Fees are
|
||||||
|
allowed.
|
||||||
|
|
||||||
|
Distribution of Compiled Forms of the Standard Version or Modified Versions
|
||||||
|
without the Source
|
||||||
|
|
||||||
|
(5) You may Distribute Compiled forms of the Standard Version without
|
||||||
|
the Source, provided that you include complete instructions on how to
|
||||||
|
get the Source of the Standard Version. Such instructions must be
|
||||||
|
valid at the time of your distribution. If these instructions, at any
|
||||||
|
time while you are carrying out such distribution, become invalid, you
|
||||||
|
must provide new instructions on demand or cease further
|
||||||
|
distribution. If you provide valid instructions or cease distribution
|
||||||
|
within thirty days after you become aware that the instructions are
|
||||||
|
invalid, then you do not forfeit any of your rights under this
|
||||||
|
license.
|
||||||
|
|
||||||
|
(6) You may Distribute a Modified Version in Compiled form without the
|
||||||
|
Source, provided that you comply with Section 4 with respect to the
|
||||||
|
Source of the Modified Version.
|
||||||
|
|
||||||
|
Aggregating or Linking the Package
|
||||||
|
|
||||||
|
(7) You may aggregate the Package (either the Standard Version or
|
||||||
|
Modified Version) with other packages and Distribute the resulting
|
||||||
|
aggregation provided that you do not charge a licensing fee for the
|
||||||
|
Package. Distributor Fees are permitted, and licensing fees for other
|
||||||
|
components in the aggregation are permitted. The terms of this license
|
||||||
|
apply to the use and Distribution of the Standard or Modified Versions
|
||||||
|
as included in the aggregation.
|
||||||
|
|
||||||
|
(8) You are permitted to link Modified and Standard Versions with
|
||||||
|
other works, to embed the Package in a larger work of your own, or to
|
||||||
|
build stand-alone binary or bytecode versions of applications that
|
||||||
|
include the Package, and Distribute the result without restriction,
|
||||||
|
provided the result does not expose a direct interface to the Package.
|
||||||
|
|
||||||
|
|
||||||
|
Items That are Not Considered Part of a Modified Version
|
||||||
|
|
||||||
|
(9) Works (including, but not limited to, modules and scripts) that
|
||||||
|
merely extend or make use of the Package, do not, by themselves, cause
|
||||||
|
the Package to be a Modified Version. In addition, such works are not
|
||||||
|
considered parts of the Package itself, and are not subject to the
|
||||||
|
terms of this license.
|
||||||
|
|
||||||
|
General Provisions
|
||||||
|
|
||||||
|
(10) Any use, modification, and distribution of the Standard or
|
||||||
|
Modified Versions is governed by this Artistic License. By using,
|
||||||
|
modifying or distributing the Package, you accept this license. Do not
|
||||||
|
use, modify, or distribute the Package, if you do not accept this
|
||||||
|
license.
|
||||||
|
|
||||||
|
(11) If your Modified Version has been derived from a Modified Version
|
||||||
|
made by someone other than you, you are nevertheless required to
|
||||||
|
ensure that your Modified Version complies with the requirements of
|
||||||
|
this license.
|
||||||
|
|
||||||
|
(12) This license does not grant you the right to use any trademark,
|
||||||
|
service mark, tradename, or logo of the Copyright Holder.
|
||||||
|
|
||||||
|
(13) This license includes the non-exclusive, worldwide,
|
||||||
|
free-of-charge patent license to make, have made, use, offer to sell,
|
||||||
|
sell, import and otherwise transfer the Package with respect to any
|
||||||
|
patent claims licensable by the Copyright Holder that are necessarily
|
||||||
|
infringed by the Package. If you institute patent litigation
|
||||||
|
(including a cross-claim or counterclaim) against any party alleging
|
||||||
|
that the Package constitutes direct or contributory patent
|
||||||
|
infringement, then this Artistic License to you shall terminate on the
|
||||||
|
date that such litigation is filed.
|
||||||
|
|
||||||
|
(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT
|
||||||
|
HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT
|
||||||
|
PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT
|
||||||
|
HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
90
packages/real/Makefile.in
Executable file
90
packages/real/Makefile.in
Executable file
@ -0,0 +1,90 @@
|
|||||||
|
################################################################
|
||||||
|
# YAP/SWI-Prolog R interface package
|
||||||
|
# Author: Nicos Angelopoulos
|
||||||
|
# Copyright: Perl License
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
PACKAGE=real
|
||||||
|
DOC=real
|
||||||
|
PKGCFLAGS=@REAL_INCLUDES@
|
||||||
|
REAL_LIBS=@REAL_LIBS@
|
||||||
|
include ../Makefile.defs
|
||||||
|
|
||||||
|
OBJS= real.o
|
||||||
|
SOLIBS= real.@SO@
|
||||||
|
|
||||||
|
LIBPL= real.pl
|
||||||
|
|
||||||
|
all: @REAL_TARGET@
|
||||||
|
|
||||||
|
ritf: $(SOLIBS)
|
||||||
|
dummy::
|
||||||
|
|
||||||
|
# this has be compatible with a name from expansion of --with-R=Dir or
|
||||||
|
# with a set of quoted names from REXEC CMD
|
||||||
|
real.o: $(srcdir)/real.c
|
||||||
|
$(CC) -c $(CFLAGS) -I. $< -o $@
|
||||||
|
|
||||||
|
real.@SO@: $(OBJS)
|
||||||
|
$(LD) $(LDSOFLAGS) -o $@ $(OBJS) $(LIBS) $(REAL_LIBS) $(LIBPLSO)
|
||||||
|
|
||||||
|
install: install-@REAL_TARGET@
|
||||||
|
install-dummy::
|
||||||
|
install-ritf: $(SOLIBS) $(addprefix $(srcdir)/, $(LIBPL))
|
||||||
|
mkdir -p $(DESTDIR)$(SOLIBDIR)
|
||||||
|
rm -f $(DESTDIR)$(SOLIBDIR)/real.@SO@
|
||||||
|
$(INSTALL_PROGRAM) $(SOLIBS) $(DESTDIR)$(SOLIBDIR)
|
||||||
|
mkdir -p $(DESTDIR)$(PLLIBDIR)
|
||||||
|
for f in $(LIBPL); do \
|
||||||
|
$(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(PLLIBDIR); \
|
||||||
|
done
|
||||||
|
$(MKINDEX)
|
||||||
|
|
||||||
|
ln-install::
|
||||||
|
$(MAKE) INSTALL_DATA="../ln-install" INSTALL_PROGRAM="../ln-install" install
|
||||||
|
|
||||||
|
rpm-install: install
|
||||||
|
|
||||||
|
html-install::
|
||||||
|
mkdir -p $(DESTDIR)$(PKGDOC)
|
||||||
|
$(INSTALL) -m 644 $(DOC).html $(DESTDIR)$(PKGDOC)
|
||||||
|
|
||||||
|
pdf-install::
|
||||||
|
mkdir -p $(DESTDIR)$(PKGDOC)
|
||||||
|
$(INSTALL) -m 644 $(DOC).pdf $(DESTDIR)$(PKGDOC)
|
||||||
|
|
||||||
|
uninstall::
|
||||||
|
(cd $(SOLIBDIR) && rm -f $(TARGETS))
|
||||||
|
(cd $(PLBASE)/library && rm -f $(LIBPL))
|
||||||
|
$(MKINDEX)
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Documentation
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
TEXEXTRA= libreal.tex
|
||||||
|
$(TEX): $(TEXEXTRA)
|
||||||
|
|
||||||
|
libreal.tex: $(srcdir)/real.pl
|
||||||
|
$(PLTOTEX) --section 'library(real)' --out=$@
|
||||||
|
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Testing
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
check::
|
||||||
|
$(PL) -q -f examples/test_real.pl -g test_real,halt -t 'halt(1)'
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# Clean
|
||||||
|
################################################################
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SOLIBS) *~ *.o *% a.out core config.log
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(TARGETS) config.cache config.h config.status Makefile
|
||||||
|
rm -f $(DOC).aux $(DOC).log $(DOC).out $(DOC).toc
|
||||||
|
rm -rf html
|
||||||
|
rm -rf autom4te.cache
|
24
packages/real/Makefile_so
Normal file
24
packages/real/Makefile_so
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# skeleton Makefile for cross compiling windows for SWI
|
||||||
|
# alot of the work is done by a prolog script that
|
||||||
|
# uses includes and R dlls in my disk space and includes those ala
|
||||||
|
# buildenv.sh (on the fly)
|
||||||
|
#
|
||||||
|
SOBJ= $(PACKSODIR)/real.$(SOEXT)
|
||||||
|
CFLAGS+=-std=c99
|
||||||
|
LIBS= -lR
|
||||||
|
|
||||||
|
all: $(SOBJ)
|
||||||
|
|
||||||
|
$(SOBJ): real.o
|
||||||
|
mkdir -p $(PACKSODIR)
|
||||||
|
$(LD) $(ARCH) $(LDSOFLAGS) -o $@ $< $(LIBS) $(SWISOLIB)
|
||||||
|
|
||||||
|
real.o:
|
||||||
|
$(CC) $(ARCH) $(CFLAGS) -c -o real.o real.c
|
||||||
|
|
||||||
|
check::
|
||||||
|
install::
|
||||||
|
clean:
|
||||||
|
rm -f real.o
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(SOBJ)
|
59
packages/real/README.md
Normal file
59
packages/real/README.md
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
|
||||||
|
Real
|
||||||
|
---
|
||||||
|
|
||||||
|
Real is a c-based interface for connecting R to Prolog.
|
||||||
|
|
||||||
|
YAP introduces a development version of real, developed to experiment
|
||||||
|
with the internals of the implementation of R. It includes major
|
||||||
|
changes and is likely to be much less stable than the version
|
||||||
|
maintained by Nicos ANgelopoulos. We refer to the version herein as
|
||||||
|
'realC' and describe the main novelties vs the version described
|
||||||
|
in~\cite{}. Their major differences:
|
||||||
|
|
||||||
|
- Most of realC is written in `C`, instead of aa a Prolog string
|
||||||
|
generator. The `C` code respects the SWI-Prolog fli interface and
|
||||||
|
should work both in YAP and in SWI-Prolog.
|
||||||
|
|
||||||
|
- realC uses Prolog atoms to represent real variables. R sequences
|
||||||
|
of characters are represented as Prolog strings (not as lists of
|
||||||
|
character codes). The atoms `true` and `false` indicate boolean
|
||||||
|
constants.
|
||||||
|
|
||||||
|
By default, YAP represents sequences of codes using double
|
||||||
|
quotes, and strings by back quotes. Please consult the
|
||||||
|
documentation o the ISO-Prolog flag `double_quotes` if you using
|
||||||
|
prefer reading double-quote strings as Prolog string.
|
||||||
|
|
||||||
|
- Free variables can be used to represent missing
|
||||||
|
arguments,ie. `a[_,"G23"] would represent the column "G23".
|
||||||
|
|
||||||
|
- All recent versions of real support the common syntax extensions
|
||||||
|
for [], (), thus realC allows writing `a[[2]] <- f().
|
||||||
|
|
||||||
|
- YAP allows A.B to be interpreted as [A|B]. This version takes
|
||||||
|
advantage of this implementation quirk, and allows one to write
|
||||||
|
expressions such as `a.b[2] <- f.g()`.
|
||||||
|
|
||||||
|
- The left-hand side msy be:
|
||||||
|
+ a ground unary term, assumed to be an attribute
|
||||||
|
+ an index
|
||||||
|
+ an R variable
|
||||||
|
+ a logic variable, or other Prolog term: in this case it will be
|
||||||
|
unified with the result of evaluating the right-hamd side.
|
||||||
|
Yap
|
||||||
|
?- [examples/for_real].
|
||||||
|
?- for_real.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
Nicos Angelopoulos and Vitor Santos Costa
|
||||||
|
December, 2012.
|
||||||
|
|
||||||
|
Updates: Nicos Angelopoulos
|
||||||
|
Dec. 2013,
|
||||||
|
March, 2014
|
||||||
|
|
||||||
|
Updates: Vitor Santos Costa
|
||||||
|
Dec. 2015
|
||||||
|
|
103
packages/real/configure.in
Executable file
103
packages/real/configure.in
Executable file
@ -0,0 +1,103 @@
|
|||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
m4_ifdef([HAS_TOP],[m4_ignore],[
|
||||||
|
AC_INIT(install-sh)
|
||||||
|
AC_PREREQ([2.50])
|
||||||
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_SUBST(REAL_INCLUDES)
|
||||||
|
AC_SUBST(REAL_LIBS)
|
||||||
|
AC_SUBST(REAL_TARGET)
|
||||||
|
|
||||||
|
AC_ARG_WITH(R,
|
||||||
|
[ --with-R[=DIR] interface to the R language],
|
||||||
|
if test "$withval" = yes; then
|
||||||
|
yap_cv_R=yes
|
||||||
|
elif test "$withval" = no; then
|
||||||
|
yap_cv_R=no
|
||||||
|
else
|
||||||
|
yap_cv_R=$withval
|
||||||
|
fi,
|
||||||
|
[yap_cv_R=no])
|
||||||
|
|
||||||
|
m4_ifdef([HAS_TOP],[m4_ignore],[ m4_include([../ac_swi_c.m4]) ])
|
||||||
|
|
||||||
|
if test "$host" != "$build" -a "$yap_cv_R" != "yes"
|
||||||
|
then
|
||||||
|
# cross-compiler
|
||||||
|
REAL_TARGET="ritf"
|
||||||
|
REAL_INCLUDES=-I"'""$yap_cv_R""'"/include
|
||||||
|
case "$target_cpu" in
|
||||||
|
i*86*)
|
||||||
|
REAL_LIBS="-L"'""$yap_cv_R""'"/bin/i386 -lR"
|
||||||
|
;;
|
||||||
|
x86*)
|
||||||
|
REAL_LIBS="-L"'""$yap_cv_R""'"/bin/x64 -lR"
|
||||||
|
;;
|
||||||
|
**)
|
||||||
|
REAL_TARGET="dummy"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
# default instalation
|
||||||
|
if test "$yap_cv_R" = "yes"
|
||||||
|
then
|
||||||
|
#assumes we have r on path
|
||||||
|
AC_CHECK_PROGS(REXE, [R.exe R r], "none", [ $PATH ] )
|
||||||
|
else
|
||||||
|
AC_CHECK_PROGS(REXE, [R.exe R r], "none", [ "$yap_cv_R"/bin:$PATH ] )
|
||||||
|
fi
|
||||||
|
#it worked?
|
||||||
|
if test "$REXE" = none -o x"$REXE" = "x"; then
|
||||||
|
REAL_TARGET="dummy"
|
||||||
|
#give up on installing R, we couldn't find it.
|
||||||
|
else
|
||||||
|
REAL_TARGET="ritf"
|
||||||
|
REAL_INCLUDES="$( $REXE CMD config --cppflags | grep -v ^WARNING)"
|
||||||
|
REAL_LIBS="$($REXE CMD config --ldflags | grep -v ^WARNING)"
|
||||||
|
# if non-nil we're done
|
||||||
|
if test x"$REAL_INCLUDES" = x; then
|
||||||
|
REAL_INCLUDES=-I\"$yap_cv_R\"/include
|
||||||
|
case "$target_cpu" in
|
||||||
|
i*86*)
|
||||||
|
REAL_LIBS="-L\"$yap_cv_R/bin/i386\" -lR"
|
||||||
|
;;
|
||||||
|
x86*)
|
||||||
|
REAL_LIBS="-L\"$yap_cv_R/bin/x64\" -lR"
|
||||||
|
;;
|
||||||
|
**)
|
||||||
|
REAL_TARGET="dummy"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $REAL_TARGET = "ritf"
|
||||||
|
then
|
||||||
|
ocppflags="$CPPFLAGS"
|
||||||
|
ocflags="$CFLAGS"
|
||||||
|
CPPFLAGS+=" $REAL_INCLUDES"
|
||||||
|
CFLAGS+=" $REAL_INCLUDES"
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS(R.h)
|
||||||
|
AC_CHECK_HEADERS(Rembedded.h)
|
||||||
|
AC_CHECK_HEADERS(Rinterface.h)
|
||||||
|
|
||||||
|
CFLAGS="$ocflags"
|
||||||
|
CPPFLAGS="$ocppflags"
|
||||||
|
fi
|
||||||
|
|
||||||
|
m4_ifdef([HAS_TOP],[m4_ignore], [AC_OUTPUT(Makefile)
|
||||||
|
AC_OUTPUT(rconfig.h)])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
50
packages/real/doc/Changes.txt
Normal file
50
packages/real/doc/Changes.txt
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
1:1:2 ?
|
||||||
|
Fixed x <- list(). on Swi 7.
|
||||||
|
Cushioned Yap use by wrapping thread_self/1 to real_thread_self/1.
|
||||||
|
|
||||||
|
1:1:0 2014/02/15 (thankless_task)
|
||||||
|
Added support for threaded execution.
|
||||||
|
We need to look into environments to make deployment easier.
|
||||||
|
|
||||||
|
1:0:4 2014/12/25
|
||||||
|
Fixed passing unamed R lists to Prolog pairs. Missing name is the number
|
||||||
|
position. Added example for that.
|
||||||
|
|
||||||
|
0:1:2 2013 November 3 (the_stoic)
|
||||||
|
Added support for a[x,y] and a().
|
||||||
|
Corrected some branch variables, thanks to new Swi warnings.
|
||||||
|
Jan, added some stuff on strings support.
|
||||||
|
|
||||||
|
0:1:1 2013 January 17 (cross_compiled)
|
||||||
|
swipl-win.exe doesnot use the std I/O streams. So <-print/1 doesnot display
|
||||||
|
on console. Added message that only displays when Prolog was started with
|
||||||
|
swipl-win.exe and only once. The windows dlls are now cross compiled.
|
||||||
|
There are now also shared (.so) libs for linux i386 and x86_64.
|
||||||
|
Added Makefile.swi to the sources.
|
||||||
|
|
||||||
|
0:1:0 2012 December 26 [oliebollen]
|
||||||
|
First release with updated syntax, documentation and Windows binaries.
|
||||||
|
Reflects state of affairs for the PADL 2013 related publication.
|
||||||
|
Great work by Vitor on passing c() via C and on utf support.
|
||||||
|
|
||||||
|
0:0:5 2012 September 12
|
||||||
|
?fixed? * in array indicators (tut5) broken (why ?).
|
||||||
|
Moved real_ex.pl to examples/for_real.pl
|
||||||
|
Fixed ' x <- list(.), x$a <- 3. '. Added to examples (composite_list).
|
||||||
|
In readme.txt autoconfig -> autoconf.
|
||||||
|
Support $ as term.
|
||||||
|
Expand the cases understood as printable to include ^ and $.
|
||||||
|
Added r_wait/0.
|
||||||
|
|
||||||
|
0:0:4 2012 May 24
|
||||||
|
Fixed translation of P <- (v1-v2)^2, (report: Michiel Hildebrand)
|
||||||
|
Added a (v1-v2)^2 example to real_ex.pl .
|
||||||
|
|
||||||
|
0:0:3 2012 Feb ??
|
||||||
|
Complete re-writing of the C-code for SWI interface. (80% done by Jan Wielimeker.)
|
||||||
|
Added examples/pagerank.pl (Vitor Santos Costa).
|
||||||
|
|
||||||
|
0:0:2 2011 Dec ??
|
||||||
|
0:0:1 2011 Dec ??
|
||||||
|
|
||||||
|
First two releases only shown to Vitor and Jan.
|
7
packages/real/doc/Issues.txt
Normal file
7
packages/real/doc/Issues.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
On MacOs the macports binary seems not to be working properly (eg median()). (Michiel Hildebrand, May 2012). The issue does not persist for MacOS binaries (i assume) from R.
|
||||||
|
|
||||||
|
On windows XP the setting of PATH does not seem to be work from within Prolog.
|
||||||
|
User needs to set the PATH to include the R.dll directory (and possibly R_HOME/modules/<exec-arch>/)
|
||||||
|
through the graphical interface ( right-click on computer and then add to the User or System
|
||||||
|
environment variable PATH).
|
||||||
|
|
34
packages/real/doc/Todo.txt
Normal file
34
packages/real/doc/Todo.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
Close connection at halt (any change of at_halt/1 Vitor ?!!).
|
||||||
|
|
||||||
|
Investigate why plot_cpu/1 needs so much stack. (does it stilL ?)
|
||||||
|
Investigate the x.y notation and see if SWI can cope with it.
|
||||||
|
Calling functions natively ?
|
||||||
|
|
||||||
|
We could drop the <- operator even, just hook an exception
|
||||||
|
handler for predicates that are not there !!!
|
||||||
|
|
||||||
|
--- threads (SWI, specific ?)
|
||||||
|
The R OS lib is thread-unsafe, add a Prolog layer to cope with this ?
|
||||||
|
|
||||||
|
Jan on Mailing list : 2013/1/10,
|
||||||
|
|
||||||
|
worker thread. Just create a thread named 'R' and initialize R.
|
||||||
|
|
||||||
|
If you want to do something with R, use
|
||||||
|
|
||||||
|
thread_self(Me),
|
||||||
|
thread_send_message('R', process(Me, <data>)),
|
||||||
|
thread_get_message(r_reply(Result))
|
||||||
|
|
||||||
|
and in the R thread, in a loop:
|
||||||
|
|
||||||
|
thread_get_message(process(Sender, Data)),
|
||||||
|
r_compute(Data, Result),
|
||||||
|
thread_send_message(Sender, r_reply(Result)).
|
||||||
|
|
||||||
|
Of course, you need to make all this a bit cleaner and handle errors,
|
||||||
|
etc, but this is the basic idea.
|
||||||
|
|
||||||
|
--- r_session compatibility add-on ?
|
||||||
|
one that would also solve the threading issue ?
|
690
packages/real/examples/for_real.pl
Normal file
690
packages/real/examples/for_real.pl
Normal file
@ -0,0 +1,690 @@
|
|||||||
|
|
||||||
|
:- ensure_loaded( library(real) ).
|
||||||
|
:- ensure_loaded( library(lists) ).
|
||||||
|
:- use_module( library(apply_macros) ).
|
||||||
|
:- use_module( library(readutil) ).
|
||||||
|
|
||||||
|
:- set_prolog_flag(double_quotes, string).
|
||||||
|
|
||||||
|
% for_real.
|
||||||
|
%
|
||||||
|
% Some examples illustrating usage of the r..eal library.
|
||||||
|
|
||||||
|
for_real :-
|
||||||
|
( Head = ex(_Ex); Head = tut(_Tut) ),
|
||||||
|
clause( Head, Body ),
|
||||||
|
write(running:Head), nl, nl,
|
||||||
|
portray_clause( (Head:-Body) ), nl, nl,
|
||||||
|
write( 'Output: ' ), nl,
|
||||||
|
( catch(Head,Exc,Fex=true) ->
|
||||||
|
( Fex==true->
|
||||||
|
write( '! ' ), write( caught(Exc) ), nl, abort
|
||||||
|
;
|
||||||
|
write(status:true)
|
||||||
|
)
|
||||||
|
;
|
||||||
|
write( '! ' ), write( failure ), nl, abort
|
||||||
|
),
|
||||||
|
nl, nl, write('-----'), nl, nl,
|
||||||
|
fail.
|
||||||
|
for_real :-
|
||||||
|
write( 'All done.' ), nl.
|
||||||
|
|
||||||
|
|
||||||
|
% ex(int).
|
||||||
|
%
|
||||||
|
% Pass the salt please.
|
||||||
|
% The most basic example: pass a Prolog list of integers to an R variable
|
||||||
|
% and then back again to a Prolog variable.
|
||||||
|
%
|
||||||
|
ex(int) :-
|
||||||
|
i <- [1,2,3,4],
|
||||||
|
<- i,
|
||||||
|
I <- i,
|
||||||
|
write( i(I) ), nl.
|
||||||
|
|
||||||
|
% float.
|
||||||
|
%
|
||||||
|
% Pass a Prolog list of floats to an R variable and then back again to a Prolog variable.
|
||||||
|
%
|
||||||
|
ex(float) :-
|
||||||
|
f <- [1.0,2,3,4],
|
||||||
|
<- f,
|
||||||
|
F <- f,
|
||||||
|
write( f(F) ), nl.
|
||||||
|
|
||||||
|
% ex( float ).
|
||||||
|
%
|
||||||
|
% Pass a mixed Prolog list of integers and floats to an R variable and
|
||||||
|
% then back again to a Prolog variable.
|
||||||
|
% The returning list is occupied by floats as is the R variable.
|
||||||
|
%
|
||||||
|
ex(to_float) :-
|
||||||
|
m <- [1,2,3,4.0],
|
||||||
|
<- m,
|
||||||
|
M1 <- m,
|
||||||
|
write( m(M1) ), nl,
|
||||||
|
m <- [1,2,3,4.1],
|
||||||
|
<- m,
|
||||||
|
M2 <- m,
|
||||||
|
write( m(M2) ), nl.
|
||||||
|
|
||||||
|
% ex(bool).
|
||||||
|
%
|
||||||
|
%
|
||||||
|
ex(bool) :-
|
||||||
|
b <- [true,false,true,true],
|
||||||
|
<- print( b ),
|
||||||
|
B <- b,
|
||||||
|
write( b(B) ), nl.
|
||||||
|
|
||||||
|
% at_bool.
|
||||||
|
%
|
||||||
|
% In cases where disambiguation is needed, boolean values can be represented by @Val terms.
|
||||||
|
%
|
||||||
|
ex(at_bool) :-
|
||||||
|
b <- [@true,@false,@true,@true],
|
||||||
|
<- print( b ),
|
||||||
|
B <- b,
|
||||||
|
write( at_b(B) ), nl.
|
||||||
|
|
||||||
|
% ex(bool_f).
|
||||||
|
%
|
||||||
|
% This fails since there is a non boolean value in a list.
|
||||||
|
%
|
||||||
|
% On SWI this fails...
|
||||||
|
% On YAP this throuws exception....
|
||||||
|
%
|
||||||
|
ex(bool_f) :-
|
||||||
|
( catch(b <- [true,false,true,true,other],_,fail) ->
|
||||||
|
fail
|
||||||
|
;
|
||||||
|
true
|
||||||
|
).
|
||||||
|
|
||||||
|
% ex(bool_back).
|
||||||
|
%
|
||||||
|
% Get some boolean values back from applying a vector element equality to an integer
|
||||||
|
% vector we just passed to R. Prints the R bools first for comparison.
|
||||||
|
%
|
||||||
|
ex(bool_back) :-
|
||||||
|
t <- [1,2,3,4,5,1],
|
||||||
|
<- print(t),
|
||||||
|
s <- t==1,
|
||||||
|
<- print(s),
|
||||||
|
S <- s,
|
||||||
|
write( s(S) ), nl.
|
||||||
|
|
||||||
|
% ex(atom_char).
|
||||||
|
%
|
||||||
|
% Pass some atoms to an R vector of characters.
|
||||||
|
%
|
||||||
|
ex(atom_char) :-
|
||||||
|
f <- [a,b,c],
|
||||||
|
<- f,
|
||||||
|
F <- f,
|
||||||
|
write( f(F) ), nl.
|
||||||
|
|
||||||
|
% ex(matrix_int).
|
||||||
|
%
|
||||||
|
% Pass a 2-level list of lists of integers to an R matrix (and back again).
|
||||||
|
%
|
||||||
|
ex(matrix_int) :-
|
||||||
|
a <- [[1,2,3],[4,5,6]],
|
||||||
|
<- print(a),
|
||||||
|
A <- a,
|
||||||
|
nl, write( a(A) ), nl.
|
||||||
|
|
||||||
|
% ex(matrix_char).
|
||||||
|
%
|
||||||
|
% Pass a 2-level list of lists of characters to an R matrix (and back again).
|
||||||
|
%
|
||||||
|
ex(matrix_char) :-
|
||||||
|
a <- [[a,b,c],[d,e,f]],
|
||||||
|
<- print(a),
|
||||||
|
A <- a,
|
||||||
|
write( a(A) ), nl.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% ex(matrix_idx).
|
||||||
|
%
|
||||||
|
ex(matrix_idx) :-
|
||||||
|
a <- [[1,2,3],[4,5,6]],
|
||||||
|
<- a,
|
||||||
|
J <- a[1,_],
|
||||||
|
write( j(J) ), nl.
|
||||||
|
|
||||||
|
% ex(list).
|
||||||
|
%
|
||||||
|
% A Prolog = pairlist to an R list. Shows 2 alternative ways to access the list items.
|
||||||
|
%
|
||||||
|
ex(list) :-
|
||||||
|
a <- [x=1,y=0,z=3],
|
||||||
|
A <- a,
|
||||||
|
X0 <- a[1],
|
||||||
|
format( 'First pair of list: ~w~n', [X0] ),
|
||||||
|
X <- a[[1]],
|
||||||
|
format( 'First element of list: ~w~n', [X] ),
|
||||||
|
Y <- a$y,
|
||||||
|
format( 'Second element of list: ~w~n', [Y] ),
|
||||||
|
write( a(A) ), nl.
|
||||||
|
|
||||||
|
% ex(list).
|
||||||
|
%
|
||||||
|
% R allows for unamed lists.
|
||||||
|
%
|
||||||
|
ex(unamed) :-
|
||||||
|
li <- list(),
|
||||||
|
li[[1]] <- c(1,2,3),
|
||||||
|
<- li,
|
||||||
|
L <- li,
|
||||||
|
write( l(L) ), nl.
|
||||||
|
|
||||||
|
% ex(list_ea).
|
||||||
|
%
|
||||||
|
% Produces error due to name of constructor: -.
|
||||||
|
%
|
||||||
|
ex(list_ea) :- % produces error
|
||||||
|
catch_controlled( a <- [x=1,y=0,z-3] ),
|
||||||
|
<- a,
|
||||||
|
A <- a,
|
||||||
|
write( a(A) ), nl.
|
||||||
|
|
||||||
|
% ex(list_eb).
|
||||||
|
%
|
||||||
|
% Produces an error due to mismatch of arity of =.
|
||||||
|
%
|
||||||
|
ex(list_eb) :-
|
||||||
|
catch_controlled( a <- [x=1,y=0,=(z,3,4)] ),
|
||||||
|
<- a,
|
||||||
|
A <- a,
|
||||||
|
write( a(A) ), nl.
|
||||||
|
|
||||||
|
% ex(char_list).
|
||||||
|
%
|
||||||
|
% Pass a list which has a char value.
|
||||||
|
%
|
||||||
|
ex(char_list) :-
|
||||||
|
a <- [x=1,y=0,z="three"],
|
||||||
|
<- print(a),
|
||||||
|
A <- a,
|
||||||
|
memberchk( Z="three", A ),
|
||||||
|
write( z(Z):a(A) ), nl.
|
||||||
|
|
||||||
|
% ex(mix_list).
|
||||||
|
%
|
||||||
|
% An R-list of mixed types.
|
||||||
|
%
|
||||||
|
ex(mix_list) :-
|
||||||
|
a <- [x=1,y=[1,2,3],z=[[a,b,c],[d,e,f]],w=[true,false]],
|
||||||
|
A <- a,
|
||||||
|
<- print(a),
|
||||||
|
write( a(A) ), nl.
|
||||||
|
|
||||||
|
% ex(list2).
|
||||||
|
%
|
||||||
|
% Illustrates ways of accessing list elements.
|
||||||
|
%
|
||||||
|
ex(list2) :-
|
||||||
|
l <- list(),
|
||||||
|
l[["what"]] <- c(1,2,3),
|
||||||
|
l$who <- c(4,5,6),
|
||||||
|
<- print(l),
|
||||||
|
L <- l,
|
||||||
|
write( l(L) ), nl.
|
||||||
|
|
||||||
|
% ex(slot).
|
||||||
|
%
|
||||||
|
% Creating formal objects and accessing their content.
|
||||||
|
%
|
||||||
|
ex(slot) :-
|
||||||
|
<- setClass("track", representation(x="numeric", y="numeric")),
|
||||||
|
myTrack <- new("track", x = -4:4, y = exp(-4:4)),
|
||||||
|
<- print( myTrack@x ),
|
||||||
|
% [1] -4 -3 -2 -1 0 1 2 3 4
|
||||||
|
Y <- myTrack@y,
|
||||||
|
write( y(Y) ), nl,
|
||||||
|
<- setClass("nest", representation(z="numeric", t="track")),
|
||||||
|
myNest <- new("nest", z=c(1,2,3) ),
|
||||||
|
myNest@t <- myTrack,
|
||||||
|
myNest@t@x <- Y+1, % good ex. for hidden vars.
|
||||||
|
<- print( myNest ),
|
||||||
|
% N <- myNest, % unsupported r-type
|
||||||
|
% X <- myNest@t@x,
|
||||||
|
<- print(myNest@t@x),
|
||||||
|
X <- myNest@t@x,
|
||||||
|
<- print( myNest@t@x ),
|
||||||
|
write( x(X) ), nl.
|
||||||
|
|
||||||
|
% myTrack@x <- c(1,2,3).
|
||||||
|
|
||||||
|
% ex(add_element).
|
||||||
|
%
|
||||||
|
% Adds a third element to a list after creation.
|
||||||
|
%
|
||||||
|
ex(add_element) :-
|
||||||
|
x <- [a=1,b=2],
|
||||||
|
x$c <- [3,4],
|
||||||
|
<- print( x ), % print = $a 3
|
||||||
|
X <- x,
|
||||||
|
write( x(X) ), nl. % X = [a=3.0].
|
||||||
|
|
||||||
|
% ex(singletons).
|
||||||
|
%
|
||||||
|
% Pass an integer and a singleton number list and get them back.
|
||||||
|
% Although in R both are passed as vectors of length on, when back in Prolog
|
||||||
|
% the singleton list constructors are stripped, returing a single integer value in both cases.
|
||||||
|
%
|
||||||
|
ex(singletons) :-
|
||||||
|
s <- 3,
|
||||||
|
<- print(s),
|
||||||
|
S <- s,
|
||||||
|
<- print( s ),
|
||||||
|
t <- [3],
|
||||||
|
<- print( t ),
|
||||||
|
T <- t,
|
||||||
|
write( s(S)-t(T) ), nl.
|
||||||
|
|
||||||
|
% ex(assign).
|
||||||
|
%
|
||||||
|
% Simple assignment of an R function (+) application on 2 R values originated in Prolog.
|
||||||
|
%
|
||||||
|
ex(assign) :-
|
||||||
|
a <- 3,
|
||||||
|
<- print( a ),
|
||||||
|
b <- [2],
|
||||||
|
<- print( b ),
|
||||||
|
C <- a + b,
|
||||||
|
write( c(C) ), nl.
|
||||||
|
|
||||||
|
|
||||||
|
% ex(assign_1).
|
||||||
|
%
|
||||||
|
% Assign the result of an R operation on matrix and value to a Prolog variable.
|
||||||
|
%
|
||||||
|
ex(assign_1) :-
|
||||||
|
a <- [[1,2,3],[4,5,6]],
|
||||||
|
<- a,
|
||||||
|
B <- a*3,
|
||||||
|
write( b(B) ), nl.
|
||||||
|
|
||||||
|
% ex(assign_2).
|
||||||
|
%
|
||||||
|
% Assign the result of an R operation on matrices to a Prolog variable.
|
||||||
|
%
|
||||||
|
ex(assign_2) :-
|
||||||
|
a <- [[1,2,3],[4,5,6]],
|
||||||
|
<- print( a ),
|
||||||
|
b <- 3,
|
||||||
|
<- print( b ),
|
||||||
|
C <- a*b,
|
||||||
|
write( c(C) ), nl.
|
||||||
|
|
||||||
|
% ex(assign_r).
|
||||||
|
%
|
||||||
|
% Assign values to R variables and operate on them.
|
||||||
|
% Using c as an R variable is also a good test, as we test against c(...).
|
||||||
|
%
|
||||||
|
ex(assign_r) :-
|
||||||
|
a <- [3],
|
||||||
|
<- print( a ),
|
||||||
|
b <- [2],
|
||||||
|
<- print( b ),
|
||||||
|
c <- a + b,
|
||||||
|
<- print( c ).
|
||||||
|
|
||||||
|
/* disable for now. once Yap supports . in atoms
|
||||||
|
re-establish this, but make sure you restor
|
||||||
|
relevant flag back to its original setting. */
|
||||||
|
|
||||||
|
% ex(dot_in_function_names).
|
||||||
|
%
|
||||||
|
% Test dots in functions names via the .. mechanism.
|
||||||
|
%
|
||||||
|
ex(dot_in_function_names) :-
|
||||||
|
a <- [1.1,2,3],
|
||||||
|
<- print(a),
|
||||||
|
x <- as.integer(a),
|
||||||
|
<- print(x).
|
||||||
|
|
||||||
|
|
||||||
|
/* as above */
|
||||||
|
% ex(dot_in_rvars).
|
||||||
|
%
|
||||||
|
% Test dots in R variable names via the .. mechanism. Generates an error on the last goal.
|
||||||
|
%
|
||||||
|
ex(dot_in_rvar) :-
|
||||||
|
a.b <- [1,2,3],
|
||||||
|
<- print( a.b ),
|
||||||
|
<- print( 'a.b' ),
|
||||||
|
catch_controlled( <- print('a..b') ).
|
||||||
|
|
||||||
|
|
||||||
|
% ex(semi_column).
|
||||||
|
%
|
||||||
|
% A:B in R generates a vector of all integers from A to B.
|
||||||
|
%
|
||||||
|
ex(semi_column) :-
|
||||||
|
z <- 1:50,
|
||||||
|
<- print( z ),
|
||||||
|
Z <- z,
|
||||||
|
length( Z, Len ),
|
||||||
|
write( len(Len) ), nl.
|
||||||
|
|
||||||
|
% ex(c_vectors).
|
||||||
|
%
|
||||||
|
% r.eal also supports c() R function concatenation.
|
||||||
|
%
|
||||||
|
ex(c_vectors) :-
|
||||||
|
a <- c(1,2,3,5), % this goes via the fast route
|
||||||
|
<- print(a),
|
||||||
|
b <- c(1,1,2,2) + c(1:4),
|
||||||
|
<- print( b ),
|
||||||
|
C <- a+b,
|
||||||
|
write( 'C'(C) ), nl.
|
||||||
|
|
||||||
|
% ex(empty_args).
|
||||||
|
%
|
||||||
|
% Test calling R functions that take no arguments (via foo()).
|
||||||
|
%
|
||||||
|
ex(empty_args) :-
|
||||||
|
<- plot( 1:10, 1:10 ),
|
||||||
|
findall( I, (between(1,6,I),write('.'), flush_output, sleep(1)), _ ),
|
||||||
|
nl,
|
||||||
|
<- dev.off(). % fixme use dev.off() when Yap starts supporting it.
|
||||||
|
|
||||||
|
% ex(string).
|
||||||
|
%
|
||||||
|
% Test new (2013/11/22) string type in SWI Prolog v7.
|
||||||
|
%
|
||||||
|
ex(string) :-
|
||||||
|
( (current_predicate(string/1),string("abc")) ->
|
||||||
|
<- plot( 1:10, 1:10, main="native string type has arrived to Prolog" ),
|
||||||
|
findall( I, (between(1,6,I),write('.'), flush_output, sleep(1)), _ )
|
||||||
|
;
|
||||||
|
true
|
||||||
|
).
|
||||||
|
|
||||||
|
% ex(binary_op).
|
||||||
|
%
|
||||||
|
% Early versions of r..eal were not handling this example properly.
|
||||||
|
% Thanks to Michiel Hildebrand for spotting this.
|
||||||
|
% The correct answer is =|[0.0,4.0]|=. First subtract v1 from v2 and then take power 2.
|
||||||
|
%
|
||||||
|
ex(binary_op) :-
|
||||||
|
v1 <- c(1,1),
|
||||||
|
<- print( v1 ),
|
||||||
|
v2 <- c(1,-1),
|
||||||
|
<- print( v2 ),
|
||||||
|
P <- (v1-v2)^2,
|
||||||
|
write( P ), nl.
|
||||||
|
% not !!! : P = [0.0, 0.0].
|
||||||
|
|
||||||
|
% ex(utf).
|
||||||
|
%
|
||||||
|
% Plots 3 points with the x-axis label showing some Greek letters (alpha/Omega).
|
||||||
|
%
|
||||||
|
ex(utf) :-
|
||||||
|
<- plot( c(1,2,3), c(3,2,1), xlab= "αω" ),
|
||||||
|
findall( I, (between(1,4,I),write('.'), flush_output, sleep(1)), _ ),
|
||||||
|
nl,
|
||||||
|
<- dev.off().
|
||||||
|
|
||||||
|
|
||||||
|
% ex(utf_atom).
|
||||||
|
%
|
||||||
|
% Plots 3 points with the x-axis label showing some Greek letters (alpha/Omega) as atom preceded by +.
|
||||||
|
%
|
||||||
|
ex(utf_atom) :-
|
||||||
|
<- plot( c(1,2,3), c(3,2,1), xlab= "α/Ω" ),
|
||||||
|
findall( I, (between(1,4,I),write('.'), flush_output, sleep(1)), _ ),
|
||||||
|
nl,
|
||||||
|
<-dev.off().
|
||||||
|
|
||||||
|
% ex( utf_1 ).
|
||||||
|
%
|
||||||
|
% Thanks to Guillem R.
|
||||||
|
%
|
||||||
|
ex(utf_1) :-
|
||||||
|
s <- ['Pour ce garçon être sur une île, y avoir des histoires de cœur ambiguës et vider un fût de bière sur un canoë entouré par des caïmans, ne fut pas un mince affaire.'],
|
||||||
|
<- print( s ),
|
||||||
|
S <- s,
|
||||||
|
write( s(S) ), nl.
|
||||||
|
|
||||||
|
% ex( utf1 ).
|
||||||
|
%
|
||||||
|
% Mostly Vitor's then Sander and last one from Nicos.
|
||||||
|
%
|
||||||
|
ex(utf_2) :-
|
||||||
|
x <- [hello, 'olá', 'जैसा कहर बरपा तो बर्बाद हो जाएगी मुंबई','Beëindigen','άμπελος'],
|
||||||
|
<- x,
|
||||||
|
X <- x,
|
||||||
|
write( x(X) ), nl.
|
||||||
|
|
||||||
|
|
||||||
|
% ex(plot_cpu).
|
||||||
|
%
|
||||||
|
% Create a plot of 4 time points. Each having a push and a pull time component.
|
||||||
|
% These are the time it takes to push a list through to R and the time to Pull the same
|
||||||
|
% (very long) list back.
|
||||||
|
%
|
||||||
|
ex(plot_cpu) :-
|
||||||
|
plot_cpu( 1000 ).
|
||||||
|
|
||||||
|
ex(debug) :-
|
||||||
|
real_debug,
|
||||||
|
write( started_debugging ), nl,
|
||||||
|
x <- c(1,2,3), % c-vectors
|
||||||
|
y <- [1,2,3], % PL data lists
|
||||||
|
X <- x, % R var to PL var
|
||||||
|
x <- [a=[1,2,4],b=[4,5,6]],
|
||||||
|
A <- x,
|
||||||
|
B <- x$b, % R expression to PL var
|
||||||
|
Y <- x$b + x$a,
|
||||||
|
x$c <- [6,3,7],
|
||||||
|
real_nodebug,
|
||||||
|
write( x(X) ), nl,
|
||||||
|
write( a(A) ), nl,
|
||||||
|
write( b(B) ), nl,
|
||||||
|
write( y(Y) ), nl,
|
||||||
|
write( stopped_debugging ), nl.
|
||||||
|
|
||||||
|
% ex(rtest).
|
||||||
|
% Some tests from r_session,
|
||||||
|
%
|
||||||
|
ex(rtest) :-
|
||||||
|
<- set.seed(1), % fixme: dot
|
||||||
|
y <- rnorm(500),
|
||||||
|
<- print(y),
|
||||||
|
x <- rnorm(y),
|
||||||
|
<- print(x),
|
||||||
|
% <- x11(width=5,height=3.5),
|
||||||
|
<- plot(x,y),
|
||||||
|
r_wait,
|
||||||
|
<- dev.off(),
|
||||||
|
Y <- y,
|
||||||
|
write( y(Y) ), nl,
|
||||||
|
findall( Zx, between(1,9,Zx), Z ),
|
||||||
|
z <- Z,
|
||||||
|
<- print( z ),
|
||||||
|
cars <- [1, 3, 6, 4, 9],
|
||||||
|
% cars <- c(1, 3, 6, 4, 9),
|
||||||
|
<- print(cars),
|
||||||
|
<- pie(cars),
|
||||||
|
r_wait,
|
||||||
|
<- dev.off().
|
||||||
|
|
||||||
|
% list_times.
|
||||||
|
%
|
||||||
|
% Print some timing statistics for operations on a long list of integers.
|
||||||
|
%
|
||||||
|
list_times :-
|
||||||
|
findall( I, between(1,10000000,I), List ),
|
||||||
|
statistics( cputime, Cpu1 ), write( cpu_1(Cpu1) ), nl,
|
||||||
|
l <- List,
|
||||||
|
a <- median( l ),
|
||||||
|
statistics( cputime, Cpu2 ), write( cpu_2(Cpu2) ), nl,
|
||||||
|
b <- median( List ),
|
||||||
|
statistics( cputime, Cpu3 ), write( cpu_3(Cpu3) ), nl,
|
||||||
|
<- print(a),
|
||||||
|
<- print(b).
|
||||||
|
|
||||||
|
% adapted from YapR
|
||||||
|
|
||||||
|
% Intrinsic attributes: mode and length
|
||||||
|
tut(tut1) :-
|
||||||
|
z <- 0:9,
|
||||||
|
<- print(z),
|
||||||
|
digits <- as.character(z), % fixme: dot
|
||||||
|
<- print(digits),
|
||||||
|
d <- as.integer(digits), % fixme: dot
|
||||||
|
<- print(d).
|
||||||
|
|
||||||
|
% changing the length of an object
|
||||||
|
tut(tut2) :-
|
||||||
|
e <- numeric(),
|
||||||
|
(e[3]) <- 17,
|
||||||
|
<- print(e),
|
||||||
|
alpha <- 1:10,
|
||||||
|
alpha <- alpha[2 * 1:5],
|
||||||
|
<- alpha, % = 2, 4, 6, 8 10
|
||||||
|
length(alpha) <- 3,
|
||||||
|
<- print(alpha), % = 2, 4, 6
|
||||||
|
nl, write( ' on beta now ' ), nl, nl,
|
||||||
|
beta <- 1:10,
|
||||||
|
beta <- 2 * beta,
|
||||||
|
<- print(beta), % 2 4 6 8 10 12 14 16 18 2
|
||||||
|
length(beta) <- 3,
|
||||||
|
<- print(beta). % 2 4 6
|
||||||
|
|
||||||
|
% Getting and setting attributes
|
||||||
|
tut(tut3) :-
|
||||||
|
z <- 1:100,
|
||||||
|
attr(z, "dim") <- c(10,10),
|
||||||
|
<- print( z ).
|
||||||
|
|
||||||
|
% factors and tapply.
|
||||||
|
tut(tut4) :-
|
||||||
|
/* state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
|
||||||
|
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
|
||||||
|
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
|
||||||
|
"sa", "act", "nsw", "vic", "vic", "act"), */
|
||||||
|
state <- [tas,sa,qld,nsw,nsw,nt,wa,wa,qld,vic,nsw,vic,qld,qld,sa,tas,sa,nt,wa,vic,qld,nsw,nsw,wa,sa,act,nsw,vic,vic,act],
|
||||||
|
<- print( state ),
|
||||||
|
% <- astate,
|
||||||
|
statef <- factor(state),
|
||||||
|
<- print( statef ),
|
||||||
|
<- levels(statef),
|
||||||
|
incomes <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
|
||||||
|
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
|
||||||
|
59, 46, 58, 43),
|
||||||
|
incmeans <- tapply(incomes, statef, mean),
|
||||||
|
% notice the function definition.
|
||||||
|
stderr <- ( function(x) -> sqrt(var(x)/length(x)) ),
|
||||||
|
% <- print( stderr ),
|
||||||
|
X <- stderr( [1,2,3,4,5,6,7,8,9,10] ),
|
||||||
|
writeln(stderr=X),
|
||||||
|
incster <- tapply(incomes, statef, stderr),
|
||||||
|
<- print( incster ).
|
||||||
|
|
||||||
|
tut(tut5) :-
|
||||||
|
z <- 1:1500,
|
||||||
|
dim(z) <- c(3,5,100),
|
||||||
|
a <- 1:24,
|
||||||
|
dim(a) <- c(3,4,2),
|
||||||
|
<- print(a[2,_,_]),
|
||||||
|
<- print(dim(a)),
|
||||||
|
x <- array(1:20, dim=c(4,5)),
|
||||||
|
<- print( x ),
|
||||||
|
i <- array(c(1:3,3:1), dim=c(3,2)),
|
||||||
|
<- print( i ),
|
||||||
|
x[i] <- 0,
|
||||||
|
<- print( x ),
|
||||||
|
h <- 1:10,
|
||||||
|
z <- array(h, dim=c(3,4,2)),
|
||||||
|
<- print( z ),
|
||||||
|
a <- array(0, dim=c(3,4,2)),
|
||||||
|
<- print( a ),
|
||||||
|
% ab <- z '%o%' a,
|
||||||
|
ab <- z+a, % z @^@ a,
|
||||||
|
<- ab,
|
||||||
|
f <- ( function(xx, yy) -> cos(yy)/(1 + xx^2) ),
|
||||||
|
w <- outer(z, a, f),
|
||||||
|
<- w.
|
||||||
|
|
||||||
|
tut(tut6) :-
|
||||||
|
d <- outer(0:9, 0:9),
|
||||||
|
fr <- table(outer(d, d, "-")),
|
||||||
|
<- plot(as.numeric(names(fr)), fr, type="h", xlab="Determinant", ylab="Frequency"), % fixme: dot
|
||||||
|
format( '~n type :- "dev.off()." to close the plot display.~n', []).
|
||||||
|
|
||||||
|
tut(tut7) :-
|
||||||
|
m <- function(x) -> [ array(a), (a[x]<- x), while((x > 0), [x <-x-1, a[x] <- a[x+1]+x]), a[0] ],
|
||||||
|
m(100),
|
||||||
|
X <- a,
|
||||||
|
writeln(X).
|
||||||
|
|
||||||
|
% auxiliary,
|
||||||
|
cpu_points( [], [], [] ).
|
||||||
|
cpu_points( [H|T], [S|Ss], [L|Ls] ) :-
|
||||||
|
between_1_and(H,Long),
|
||||||
|
statistics( cputime, _) ,
|
||||||
|
length( Long, Lengtho ), write( leno(Lengtho) ), nl,
|
||||||
|
statistics( cputime, S0 ),
|
||||||
|
( number(S0) -> S0 = S ; S0 = [_,S] ),
|
||||||
|
% statistics( cputime, [_,S] ),
|
||||||
|
long <- Long,
|
||||||
|
Back <- long,
|
||||||
|
Back = [Hb|_],
|
||||||
|
Hb =:= 1,
|
||||||
|
statistics( cputime, L0 ),
|
||||||
|
( number(L0) -> L0 = L ; L0 = [_,L] ),
|
||||||
|
% statistics( cputime, [_,L] ),
|
||||||
|
length( Back, BackLen ),
|
||||||
|
write( back_len(BackLen) ), nl,
|
||||||
|
% L = 0,
|
||||||
|
cpu_points( T, Ss, Ls ) .
|
||||||
|
|
||||||
|
% auxiliaries,
|
||||||
|
|
||||||
|
catch_controlled( Expr ) :-
|
||||||
|
catch( Expr, Caught, true ),
|
||||||
|
( \+ var(Caught) -> write( caught_controlled(Caught) ), nl; fail ).
|
||||||
|
|
||||||
|
between_1_and(N,X) :-
|
||||||
|
( var(N) -> N is 100; true ),
|
||||||
|
IntN is integer(N),
|
||||||
|
findall( I, between(1,IntN,I), Is ),
|
||||||
|
i <- Is,
|
||||||
|
X <- i.
|
||||||
|
cpu( R ) :-
|
||||||
|
( var(R) -> R is 10000; true ),
|
||||||
|
findall( F, between_1_and(R,F), Fs ),
|
||||||
|
f <- Fs,
|
||||||
|
statistics( cputime, Cpu1 ),
|
||||||
|
write( cputime_to_push(Cpu1) ), nl,
|
||||||
|
X <- f, % when F <- f the predicate fails midway for large Len !!!
|
||||||
|
statistics( cputime, Cpu2 ),
|
||||||
|
write( cputime_to_pull(Cpu2) ), nl,
|
||||||
|
length( X, Len ),
|
||||||
|
write( len(Len) ), nl.
|
||||||
|
plot_cpu( Factor ) :-
|
||||||
|
nl,
|
||||||
|
( Factor > 10 ->
|
||||||
|
M='if your set-up fails on this test increase the size of stack.',
|
||||||
|
write( M ), nl, nl
|
||||||
|
;
|
||||||
|
true
|
||||||
|
),
|
||||||
|
points <- [10,100,500,1000],
|
||||||
|
points <- as.integer( points * Factor ), % fixme: dot
|
||||||
|
<- points,
|
||||||
|
Points <- points,
|
||||||
|
write( points(Points) ), nl,
|
||||||
|
cpu_points( Points, Push, Pull ),
|
||||||
|
push <- Push,
|
||||||
|
pull <- Pull,
|
||||||
|
write( plotting(Pull,Push) ), nl,
|
||||||
|
<- plot( points, pull, ylab = "pull & push (red) - in seconds" ),
|
||||||
|
<- points( points, push, col="red" ).
|
82
packages/real/examples/pagerank.pl
Normal file
82
packages/real/examples/pagerank.pl
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
:- use_module(library(real)).
|
||||||
|
%:- r(install..packages("igraph")).
|
||||||
|
:- r(library("igraph") ).
|
||||||
|
|
||||||
|
aleph :-
|
||||||
|
pagerank('aleph.pl').
|
||||||
|
|
||||||
|
pagerank(F) :-
|
||||||
|
% g <- graph([0,0],n=1000),
|
||||||
|
parse(F,S),
|
||||||
|
g <- graph(S),
|
||||||
|
r <- page..rank(g),
|
||||||
|
Scores <- r$vector,
|
||||||
|
max_element(Scores, I, V),
|
||||||
|
found(N, A, I),
|
||||||
|
format('most linked predicate is ~a/~d, score ~2f.~n',[N,A,V]).
|
||||||
|
|
||||||
|
max_element(S, IF, VF) :-
|
||||||
|
S = [V|Els],
|
||||||
|
max_element(Els, V, 0, 0, IF, VF).
|
||||||
|
|
||||||
|
max_element([], VF, IM, _, IM, VF).
|
||||||
|
max_element([V|Els], VM, _IM, I0, IF, VF) :-
|
||||||
|
V > VM, !,
|
||||||
|
I is I0+1,
|
||||||
|
max_element(Els, V, I0, I, IF, VF).
|
||||||
|
max_element([_|Els], VM, IM, I0, IF, VF) :-
|
||||||
|
I is I0+1,
|
||||||
|
max_element(Els, VM, IM, I, IF, VF).
|
||||||
|
|
||||||
|
parse(File, L) :-
|
||||||
|
open(File, read, S),
|
||||||
|
findall(O, process(S, O),L),
|
||||||
|
close(S).
|
||||||
|
|
||||||
|
process(S, O) :-
|
||||||
|
repeat,
|
||||||
|
read(S, T),
|
||||||
|
% writeln(T),
|
||||||
|
(
|
||||||
|
T == end_of_file -> !, fail ;
|
||||||
|
do(T, O)
|
||||||
|
).
|
||||||
|
|
||||||
|
do((A :- B), O) :-
|
||||||
|
id(A, IDA),
|
||||||
|
process_body(B, IDA, O).
|
||||||
|
do((:- G),_) :- catch(call(G),_,fail), !, fail.
|
||||||
|
|
||||||
|
process_body(B, _IDA, _) :- var(B), !, fail.
|
||||||
|
process_body((B1,B2), IDA,O) :- !,
|
||||||
|
process_body(B1, IDA, O) ;
|
||||||
|
process_body(B2, IDA, O).
|
||||||
|
process_body((B1;B2), IDA, O) :- !,
|
||||||
|
process_body(B1, IDA, O) ;
|
||||||
|
process_body(B2, IDA, O).
|
||||||
|
process_body((B1->B2), IDA, O) :- !,
|
||||||
|
process_body(B1, IDA, O) ;
|
||||||
|
process_body(B2, IDA, O).
|
||||||
|
process_body(B, IDA, O) :-
|
||||||
|
id(B,IDB),
|
||||||
|
( O = IDB; O = IDA ).
|
||||||
|
% r(add..edges(g,c(IDA,IDB))).
|
||||||
|
|
||||||
|
:- dynamic ids/1, found/3, exists/2.
|
||||||
|
|
||||||
|
new(IDA,IDB) :-
|
||||||
|
\+ exists(IDA,IDB),
|
||||||
|
assert(exists(IDA,IDB)).
|
||||||
|
|
||||||
|
|
||||||
|
id(F, I) :-
|
||||||
|
functor(F,N,A),
|
||||||
|
(found(N,A,I) -> true ; new(N, A, I) ).
|
||||||
|
|
||||||
|
ids(0).
|
||||||
|
|
||||||
|
new(N, A, I) :-
|
||||||
|
retract(ids(I)),
|
||||||
|
I1 is I+1,
|
||||||
|
assert(found(N,A,I)),
|
||||||
|
assert(ids(I1)).
|
28
packages/real/examples/test_real.pl
Normal file
28
packages/real/examples/test_real.pl
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
:- module(test_real,
|
||||||
|
[ test_real/1
|
||||||
|
]).
|
||||||
|
|
||||||
|
:- asserta(user:file_search_path(foreign, '.')).
|
||||||
|
:- asserta(user:file_search_path(library, '.')).
|
||||||
|
:- asserta(user:file_search_path(library, '../plunit')).
|
||||||
|
|
||||||
|
:- use_module( library(real) ).
|
||||||
|
:- use_module(library(plunit)).
|
||||||
|
|
||||||
|
test_real(_) :-
|
||||||
|
run_tests([ real
|
||||||
|
]).
|
||||||
|
|
||||||
|
:- begin_tests(real).
|
||||||
|
|
||||||
|
test(int_array) :-
|
||||||
|
x <- c(1,2,3),
|
||||||
|
X <- x,
|
||||||
|
X == [1,2,3].
|
||||||
|
|
||||||
|
test(mixed_array) :-
|
||||||
|
y <- c(1,2,3.1),
|
||||||
|
Y <- y,
|
||||||
|
Y = [1.0,2.0,3.1].
|
||||||
|
|
||||||
|
:- end_tests(real).
|
10
packages/real/pack.pl
Normal file
10
packages/real/pack.pl
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
name(real).
|
||||||
|
version('1.1.0').
|
||||||
|
title('Integrative statistics with R').
|
||||||
|
keywords([statistics,'R',bioinformatics,'machine learning']).
|
||||||
|
author( 'Nicos Angelopoulos', 'http://stoics.org.uk/~nicos' ).
|
||||||
|
author( 'Vitor Santos Costa', 'http:/www.dcc.fc.up.pt/~vsc' ).
|
||||||
|
packager( 'Nicos Angelopoulos', 'http://stoics.org.uk/~nicos' ).
|
||||||
|
maintainer( 'Nicos Angelopoulos', 'http://stoics.org.uk/~nicos' ).
|
||||||
|
home( 'http://stoics.org.uk/~nicos/sware/real' ).
|
||||||
|
download( 'http://stoics.org.uk/~nicos/sware/packs/real/real-*.tgz' ).
|
78
packages/real/pltotex.pl
Normal file
78
packages/real/pltotex.pl
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
:- module(pltotex,
|
||||||
|
[ pltotex/2,
|
||||||
|
pltotex/0
|
||||||
|
]).
|
||||||
|
:- use_module(library(doc_latex)).
|
||||||
|
:- use_module(library(main)).
|
||||||
|
:- use_module(library(error)).
|
||||||
|
:- use_module(library(apply)).
|
||||||
|
:- use_module(library(lists)).
|
||||||
|
|
||||||
|
:- asserta(user:file_search_path(foreign, .)).
|
||||||
|
|
||||||
|
pltotex(File, Options) :-
|
||||||
|
file_name_extension(_, txt, File), !,
|
||||||
|
tex_file(File, Out, Options),
|
||||||
|
doc_latex(File, Out,
|
||||||
|
[ stand_alone(false)
|
||||||
|
| Options
|
||||||
|
]).
|
||||||
|
pltotex(Lib, Options) :-
|
||||||
|
( file_name_extension(_, pl, Lib)
|
||||||
|
-> Spec = Lib
|
||||||
|
; atom_to_term(Lib, Spec, _)
|
||||||
|
),
|
||||||
|
absolute_file_name(Spec, File,
|
||||||
|
[ access(read),
|
||||||
|
file_type(prolog)
|
||||||
|
]),
|
||||||
|
tex_file(File, Out, Options),
|
||||||
|
user:use_module(File), % we want the operators in user
|
||||||
|
doc_latex(File, Out,
|
||||||
|
[ stand_alone(false)
|
||||||
|
| Options
|
||||||
|
]).
|
||||||
|
|
||||||
|
tex_file(_, TeXFile, Options) :-
|
||||||
|
option(out(Base), Options), !,
|
||||||
|
file_name_extension(Base, tex, TeXFile).
|
||||||
|
tex_file(File, TeXFile, _) :-
|
||||||
|
file_base_name(File, Local),
|
||||||
|
file_name_extension(Base0, _, Local),
|
||||||
|
strip(Base0, 0'_, Base),
|
||||||
|
file_name_extension(Base, tex, TeXFile).
|
||||||
|
|
||||||
|
strip(In, Code, Out) :-
|
||||||
|
atom_codes(In, Codes0),
|
||||||
|
delete(Codes0, Code, Codes),
|
||||||
|
atom_codes(Out, Codes).
|
||||||
|
|
||||||
|
|
||||||
|
%% pltotex
|
||||||
|
%
|
||||||
|
% Usage: pl -q -s pltotex.pl -g pltotex -- file ...
|
||||||
|
|
||||||
|
pltotex :-
|
||||||
|
main.
|
||||||
|
|
||||||
|
main(Argv) :-
|
||||||
|
partition(is_option, Argv, OptArgs, Files),
|
||||||
|
maplist(to_option, OptArgs, Options),
|
||||||
|
maplist(process_file(Options), Files).
|
||||||
|
|
||||||
|
is_option(Arg) :-
|
||||||
|
sub_atom(Arg, 0, _, _, --).
|
||||||
|
|
||||||
|
to_option('--section', section_level(section)) :- !.
|
||||||
|
to_option('--subsection', section_level(subsection)) :- !.
|
||||||
|
to_option('--subsubsection', section_level(subsubsection)) :- !.
|
||||||
|
to_option(Arg, Option) :-
|
||||||
|
atom_concat(--, Opt, Arg),
|
||||||
|
sub_atom(Opt, B, _, A, =), !,
|
||||||
|
sub_atom(Opt, 0, B, _, Name),
|
||||||
|
sub_atom(Opt, _, A, 0, Value),
|
||||||
|
Option =.. [Name, Value].
|
||||||
|
|
||||||
|
process_file(Options, File) :-
|
||||||
|
pltotex(File, Options).
|
||||||
|
|
26
packages/real/rconfig.h.cmake
Normal file
26
packages/real/rconfig.h.cmake
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*--------------------------------------------------------------------------
|
||||||
|
* This file is autogenerated from rconfig.h.cmake
|
||||||
|
* during the cmake configuration of your project. If you need to make changes
|
||||||
|
* edit the original file NOT THIS FILE.
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
#ifndef RCONFIG_H
|
||||||
|
#define RCONFIG_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#ifndef HAVE_R_H
|
||||||
|
#cmakedefine HAVE_R_H ${HAVE_R_H}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#ifndef HAVE_R_EMBEDDED_H
|
||||||
|
#cmakedefine HAVE_R_EMBEDDED_H ${HAVE_R_EMBEDDED_H}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#ifndef HAVE_R_INTERFACE_H
|
||||||
|
#cmakedefine HAVE_R_INTERFACE_H ${HAVE_R_INTERFACE_H}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
26
packages/real/rconfig.h.in
Normal file
26
packages/real/rconfig.h.in
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*--------------------------------------------------------------------------
|
||||||
|
* This file is autogenerated from rconfig.h.cmake
|
||||||
|
* during the cmake configuration of your project. If you need to make changes
|
||||||
|
* edit the original file NOT THIS FILE.
|
||||||
|
* --------------------------------------------------------------------------*/
|
||||||
|
#ifndef RCONFIG_H
|
||||||
|
#define RCONFIG_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#ifndef HAVE_R_H
|
||||||
|
#undef HAVE_R_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#ifndef HAVE_R_EMBEDDED_H
|
||||||
|
#undef HAVE_R_EMBEDDED_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ,Define to 1 if you have the <alloca.h> header file. */
|
||||||
|
#ifndef HAVE_R_INTERFACE_H
|
||||||
|
#undef HAVE_R_INTERFACE_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
2395
packages/real/real.c
Normal file
2395
packages/real/real.c
Normal file
File diff suppressed because it is too large
Load Diff
39
packages/real/real.doc
Normal file
39
packages/real/real.doc
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
\documentclass[11pt]{article}
|
||||||
|
\usepackage{times}
|
||||||
|
\usepackage{pl}
|
||||||
|
\usepackage{html}
|
||||||
|
\sloppy
|
||||||
|
\makeindex
|
||||||
|
|
||||||
|
\onefile
|
||||||
|
\htmloutput{.} % Output directory
|
||||||
|
\htmlmainfile{real} % Main document file
|
||||||
|
\bodycolor{white} % Page colour
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\title{SWI/YAP Prolog interface to R}
|
||||||
|
\author{Nicos Angelopoulos \\
|
||||||
|
V\'{\i}tor Santos Costa \\
|
||||||
|
Jan Wielemaker
|
||||||
|
}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\begin{abstract}
|
||||||
|
This package contains an interface to
|
||||||
|
\url[The R Project for Statistical Computing]{http://www.r-project.org/}
|
||||||
|
\end{abstract}
|
||||||
|
|
||||||
|
\pagebreak
|
||||||
|
\tableofcontents
|
||||||
|
|
||||||
|
\vfill
|
||||||
|
\vfill
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
\input{libreal.tex}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
|
|
68
packages/real/real.h
Normal file
68
packages/real/real.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#include <Rembedded.h>
|
||||||
|
#include <R.h>
|
||||||
|
#include <Rinternals.h>
|
||||||
|
#include <Rdefines.h>
|
||||||
|
#include <R_ext/Parse.h>
|
||||||
|
|
||||||
|
#include <YapInterface.h>
|
||||||
|
#include <c_interface.h>
|
||||||
|
|
||||||
|
#define BUFSIZE 256
|
||||||
|
|
||||||
|
typedef unsigned int PL_Type;
|
||||||
|
|
||||||
|
#define PL_Nil 0
|
||||||
|
#define PL_Var 1
|
||||||
|
#define PL_Atom 2
|
||||||
|
#define PL_Appl 3
|
||||||
|
#define PL_Pair 4
|
||||||
|
#define PL_Int 5
|
||||||
|
#define PL_Float 6
|
||||||
|
#define PL_DbRef 7
|
||||||
|
#define PL_Unknown 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
r_undefined,
|
||||||
|
r_double,
|
||||||
|
r_int,
|
||||||
|
r_character
|
||||||
|
} r_basic_types;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
r_basic_types type;
|
||||||
|
union {
|
||||||
|
int int_val;
|
||||||
|
double double_val;
|
||||||
|
char *char_val;
|
||||||
|
} real_u;
|
||||||
|
} list_cell;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
int nDims;
|
||||||
|
int dims[BUFSIZE];
|
||||||
|
list_cell values[BUFSIZE];
|
||||||
|
} list;
|
||||||
|
|
||||||
|
#define real_Int 1
|
||||||
|
#define real_Float 2
|
||||||
|
#define real_Char 3
|
||||||
|
#define real_Bool 4
|
||||||
|
|
||||||
|
#define real_ty_Vector 1
|
||||||
|
#define real_ty_Matrix 2
|
||||||
|
#define real_ty_List 3
|
||||||
|
#define real_ty_Array 4 //not used, yet
|
||||||
|
|
||||||
|
extern void init_R(void);
|
||||||
|
extern void end_R(void);
|
||||||
|
extern void send_command(char * expression);
|
||||||
|
extern int set_list_values(void);
|
||||||
|
extern int set_vec_values(void);
|
||||||
|
extern int set_array_values(void);
|
||||||
|
extern SEXP process_expression(char * expression);
|
||||||
|
extern YAP_Term sexp_pl(SEXP s);
|
1157
packages/real/real.pl
Executable file
1157
packages/real/real.pl
Executable file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user