1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*  Copyright (c) 2002-2023 Zuse Institute Berlin (ZIB)                      */
7    	/*                                                                           */
8    	/*  Licensed under the Apache License, Version 2.0 (the "License");          */
9    	/*  you may not use this file except in compliance with the License.         */
10   	/*  You may obtain a copy of the License at                                  */
11   	/*                                                                           */
12   	/*      http://www.apache.org/licenses/LICENSE-2.0                           */
13   	/*                                                                           */
14   	/*  Unless required by applicable law or agreed to in writing, software      */
15   	/*  distributed under the License is distributed on an "AS IS" BASIS,        */
16   	/*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17   	/*  See the License for the specific language governing permissions and      */
18   	/*  limitations under the License.                                           */
19   	/*                                                                           */
20   	/*  You should have received a copy of the Apache-2.0 license                */
21   	/*  along with SCIP; see the file LICENSE. If not visit scipopt.org.         */
22   	/*                                                                           */
23   	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24   	
25   	/**@file   objreader.cpp
26   	 * @brief  C++ wrapper for file readers
27   	 * @author Tobias Achterberg
28   	 */
29   	
30   	/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
31   	
32   	#include <cassert>
33   	
34   	#include "objreader.h"
35   	
36   	
37   	
38   	
39   	/*
40   	 * Data structures
41   	 */
42   	
43   	/** file reader data */
44   	struct SCIP_ReaderData
45   	{
46   	   scip::ObjReader*      objreader;          /**< file reader object */
47   	   SCIP_Bool             deleteobject;       /**< should the reader object be deleted when reader is freed? */
48   	};
49   	
50   	
51   	
52   	
53   	/*
54   	 * Callback methods of file reader
55   	 */
56   	
57   	extern "C"
58   	{
59   	
60   	/** copy method for reader plugins (called when SCIP copies plugins) */
61   	static
62   	SCIP_DECL_READERCOPY(readerCopyObj)
63   	{  /*lint --e{715}*/
64   	   SCIP_READERDATA* readerdata;
65   	   
66   	   assert(scip != NULL);
67   	   
68   	   readerdata = SCIPreaderGetData(reader);
69   	   assert(readerdata != NULL);
70   	   assert(readerdata->objreader != NULL);
71   	   assert(readerdata->objreader->scip_ != scip);
72   	
73   	   if( readerdata->objreader->iscloneable() )
74   	   {
75   	      scip::ObjReader* newobjreader;
76   	      newobjreader = dynamic_cast<scip::ObjReader*> (readerdata->objreader->clone(scip));
77   	
78   	      /* call include method of reader object */
79   	      SCIP_CALL( SCIPincludeObjReader(scip, newobjreader, TRUE) );
80   	   }
81   	
82   	   return SCIP_OKAY;
83   	}
84   	
85   	/** destructor of file reader to free user data (called when SCIP is exiting) */
86   	static
87   	SCIP_DECL_READERFREE(readerFreeObj)
88   	{  /*lint --e{715}*/
89   	   SCIP_READERDATA* readerdata;
90   	
91   	   readerdata = SCIPreaderGetData(reader);
92   	   assert(readerdata != NULL);
93   	   assert(readerdata->objreader != NULL);
94   	   assert(readerdata->objreader->scip_ == scip);
95   	
96   	   /* call virtual method of reader object */
97   	   SCIP_CALL( readerdata->objreader->scip_free(scip, reader) );
98   	
99   	   /* free reader object */
100  	   if( readerdata->deleteobject )
101  	      delete readerdata->objreader;
102  	
103  	   /* free reader data */
104  	   delete readerdata;
105  	   SCIPreaderSetData(reader, NULL); /*lint !e64*/
106  	   
107  	   return SCIP_OKAY;
108  	}
109  	
110  	
111  	/** problem reading method of reader */
112  	static
113  	SCIP_DECL_READERREAD(readerReadObj)
114  	{  /*lint --e{715}*/
115  	   SCIP_READERDATA* readerdata;
116  	
117  	   readerdata = SCIPreaderGetData(reader);
118  	   assert(readerdata != NULL);
119  	   assert(readerdata->objreader != NULL);
120  	   assert(readerdata->objreader->scip_ == scip);
121  	
122  	   /* call virtual method of reader object */
123  	   SCIP_CALL( readerdata->objreader->scip_read(scip, reader, filename, result) );
124  	
125  	   return SCIP_OKAY;
126  	}
127  	
128  	
129  	/** problem writing method of reader */
130  	static
131  	SCIP_DECL_READERWRITE(readerWriteObj)
132  	{  /*lint --e{715}*/
133  	   SCIP_READERDATA* readerdata;
134  	
135  	   readerdata = SCIPreaderGetData(reader);
136  	   assert(readerdata != NULL);
137  	   assert(readerdata->objreader != NULL);
138  	
139  	   /* call virtual method of reader object */
140  	   SCIP_CALL( readerdata->objreader->scip_write(scip, reader, file, name, probdata, transformed, 
141  	         objsense, objscale, objoffset, 
142  	         vars, nvars, nbinvars, nintvars, nimplvars, ncontvars, fixedvars, nfixedvars, startnvars,
143  	         conss, nconss, maxnconss, startnconss, genericnames, result) );
144  	   
145  	   return SCIP_OKAY;
146  	}
147  	}
148  	
149  	
150  	/*
151  	 * file reader specific interface methods
152  	 */
153  	
154  	/** creates the file reader for the given file reader object and includes it in SCIP */
155  	SCIP_RETCODE SCIPincludeObjReader(
156  	   SCIP*                 scip,               /**< SCIP data structure */
157  	   scip::ObjReader*      objreader,          /**< file reader object */
158  	   SCIP_Bool             deleteobject        /**< should the reader object be deleted when reader is freed? */
159  	   )
160  	{
161  	   SCIP_READERDATA* readerdata;
162  	
163  	   assert(scip != NULL);
164  	   assert(objreader != NULL);
165  	
166  	   /* create file reader data */
167  	   readerdata = new SCIP_READERDATA;
168  	   readerdata->objreader = objreader;
169  	   readerdata->deleteobject = deleteobject;
170  	
171  	   /* include file reader */
172  	   SCIP_CALL( SCIPincludeReader(scip, objreader->scip_name_, objreader->scip_desc_, objreader->scip_extension_,
173  	         readerCopyObj,
174  	         readerFreeObj, readerReadObj, readerWriteObj, readerdata) ); /*lint !e429*/
175  	
176  	   return SCIP_OKAY; /*lint !e429*/
177  	}
178  	
179  	/** returns the reader object of the given name, or 0 if not existing */
180  	scip::ObjReader* SCIPfindObjReader(
181  	   SCIP*                 scip,               /**< SCIP data structure */
182  	   const char*           name                /**< name of file reader */
183  	   )
184  	{
185  	   SCIP_READER* reader;
186  	   SCIP_READERDATA* readerdata;
187  	
188  	   reader = SCIPfindReader(scip, name);
189  	   if( reader == NULL )
190  	      return 0;
191  	
192  	   readerdata = SCIPreaderGetData(reader);
193  	   assert(readerdata != NULL);
194  	
195  	   return readerdata->objreader;
196  	}
197  	   
198  	/** returns the reader object for the given file reader */
199  	scip::ObjReader* SCIPgetObjReader(
200  	   SCIP*                 scip,               /**< SCIP data structure */
201  	   SCIP_READER*          reader              /**< file reader */
202  	   )
203  	{
204  	   SCIP_READERDATA* readerdata;
205  	
206  	   assert(scip != NULL);
207  	   readerdata = SCIPreaderGetData(reader);
208  	   assert(readerdata != NULL);
209  	
210  	   return readerdata->objreader;
211  	}
212